更改跟踪实体框架

时间:2016-09-15 11:13:07

标签: c# entity-framework change-tracking

我为之前的属性名称和值之后的值制作表格 如何使用更改跟踪来更改此表格

2 个答案:

答案 0 :(得分:0)

您可以使用“更改跟踪”跟踪操作,更改的列和新值。但是,无法从变更跟踪中获取旧值。 SQL Server 2016提供了新功能“更改数据捕获”,它在更新/删除之前为您提供有关旧值的所需信息(请参阅https://msdn.microsoft.com/en-us/library/bb933994.aspx)。

如果您无法访问SQL Server 2016,可以使用以下命令配置更改跟踪:

  • 在数据库中激活

    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)  
    
  • 设置数据库作业,每分钟,每小时,每天(您需要的)将更改信息复制到自定义表中

    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。您可以为表的每一列添加此值,并在值= 1时加入,然后将值添加到查询中。

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

答案 1 :(得分:0)

实际上,如果您覆盖数据上下文类中的 3 _calendar 1 _cyrus 4 _devicemgr 1 _dovecot 1 _eppc 2 _jabber 1 _locationd 2 _postfix 1 _softwareupdate 1 _taskgated 6 _teamsserver 1 _warmd 1 _xserverdocs 11 root 方法,则可以访问SaveChanges()。这将为您提供当前由上下文跟踪的所有实体及其ChangeTracker(如果它们被添加/修改/删除/未更改等)。

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

DbEntityEntry

我目前使用这种方法对谁在做什么实体进行一些基本的审计。