更改跟踪实体框架

本文关键字:框架 实体 跟踪 | 更新日期: 2023-09-27 18:07:03

i make table for property name and value before and value after
我如何使用更改跟踪存储更改在这个?

更改跟踪实体框架

您可以使用Change Tracking来跟踪操作、更改的列和新值。然而,从变更跟踪中获取旧值是不可能的。SQL Server 2016提供了新功能"更改数据捕获",它可以在更新/删除发生之前为您提供有关旧值的所需信息(参见https://msdn.microsoft.com/en-us/library/bb933994.aspx)。

如果你没有访问SQL Server 2016的权限,这里是如何配置更改跟踪:

  • Activate at Database

    ALTER DATABASE <YourDatabase> f.e. DeviceDatabase
    SET CHANGE_TRACKING = ON  
    (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) 
    
  • 为您需要的表激活更改跟踪

    ALTER TABLE <YourTable> f.e. Devices  
    ENABLE CHANGE_TRACKING  
    WITH (TRACK_COLUMNS_UPDATED = ON)  
    
  • 设置一个DB Job,它将每分钟、每小时、每天(根据您的需要)复制更改信息到您的自定义表

    DECLARE @minversion bigint;
    SET @minversion = (SELECT MinVersion = CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Devices')) )
    SELECT SYS_CHANGE_COLUMNS, e.Id FROM
    CHANGETABLE(CHANGES Devices, @minversion) AS C
    LEFT OUTER JOIN Devices AS e  
    ON e.Id = c.Id;  
    
  • 要获取更改列的最新值,您可以尝试此操作(但要注意同一行的多次更新)。你只得到最新的值)。

    CHANGE_TRACKING_IS_COLUMN_IN_MASK
    (COLUMNPROPERTY(OBJECT_ID('Devices'), 'Id', 'ColumnId')
    ,c.sys_change_columns)
    

如果列改变,返回1,否则返回0。您可以为表的每个列添加此值,并在value = 1上连接,然后将该值添加到查询中。

最后,我只建议使用存储过程来更新/插入/删除表。在这些表中,您可以轻松地插入想要在自定义表中存储的有关更改的所有信息。如果你有SQL Server 2016,尝试我上面提到的,最终。

实际上,如果你在数据上下文类中重写SaveChanges()方法,你可以访问ChangeTracker。这将为您提供当前由上下文及其EntityState跟踪的所有实体(如果它们被添加/修改/删除/更改等)。

在这里,您可以获得DbEntityEntry类,并从中获得实体的当前值和/或其先前值,如果实体处于修改状态。

public override int SaveChanges()
{
    var allTrackedEntities = this.ChangeTracker.Entries().ToList();
    return base.SaveChanges();
}

我目前使用这个方法来做一些基本的审计谁在做什么实体