如何在EF中获得实体更改增量?

我只需要获取已更改字段的列表,数据存储区是ssce,因此没有可用的触发器

EF中是否有任何支持来获取列表或构建通用组件?

根据上下文的类型和生成的实体,您可以通过几种不同的方式来完成。 如果是从Entity或POCOinheritance的对象,您可以在自我跟踪实体的情况下使用ObjectStateManager ,您可以从实体本身使用Tracker。

请提供有关生成上下文的方式以及如何进行更改的更多详细信息

EDITED(2):您可以像下面这样查询ObjectStateManager以获取更改的条目:

  var changed = ctx.ObjectStateManager.GetObjectStateEntries().Where(e=>e.State != EntityState.Unchanged); 

编辑(1):

MSDN中的以下示例演示了如何查询更改:

 int orderId = 43680; using (AdventureWorksEntities context = new AdventureWorksEntities()) { var order = (from o in context.SalesOrderHeaders where o.SalesOrderID == orderId select o).First(); // Get ObjectStateEntry from EntityKey. ObjectStateEntry stateEntry = context.ObjectStateManager .GetObjectStateEntry(((IEntityWithKey)order).EntityKey); //Get the current value of SalesOrderHeader.PurchaseOrderNumber. CurrentValueRecord rec1 = stateEntry.CurrentValues; string oldPurchaseOrderNumber = (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); //Change the value. order.PurchaseOrderNumber = "12345"; string newPurchaseOrderNumber = (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); // Get the modified properties. IEnumerable modifiedFields = stateEntry.GetModifiedProperties(); foreach (string s in modifiedFields) Console.WriteLine("Modified field name: {0}\n Old Value: {1}\n New Value: {2}", s, oldPurchaseOrderNumber, newPurchaseOrderNumber); // Get the Entity that is associated with this ObjectStateEntry. SalesOrderHeader associatedEnity = (SalesOrderHeader)stateEntry.Entity; Console.WriteLine("Associated Enity's ID: {0}", associatedEnity.SalesOrderID); } 

通过使用数据库结构本身来执行此操作通常是一种很好的做法。 这只是你现在拥有的另一种方法。

您可以在名为ModifiedOn的表中创建datetime类型的新字段,并在每次更新数据库中的行时更新它。

然后,当您想要在特定时间之后更改的行时,您只需使用:

 where ModifiedOn > dateTime 

这是关于如何从不同角度解决问题的另一个建议。