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

时间:2011-12-14 17:44:03

标签: c# .net entity-framework sql-server-ce

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

EDITED(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<string> 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);
}

答案 1 :(得分:2)

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

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

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

where ModifiedOn > dateTime

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