更改跟踪实体框架
本文关键字:框架 实体 跟踪 | 更新日期: 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();
}
我目前使用这个方法来做一些基本的审计谁在做什么实体