实体框架不会在更新时更改EnityState

时间:2016-05-18 14:37:10

标签: c# entity-framework self-tracking-entities

我有一个工作Update方法,它只是更改属性值并在db上下文中调用SaveChanges()

public void Update(int id, string name)
{
    var entity = context.Entities.Single(x => x.Id == id);
    entity.Name = name;
    context.SaveChanges();
}

这样确实可以应用更改,但EnityState仍然是“未更改”。有什么想法为什么?我试图避免告诉EF明确发生了什么,例如使用context.Entry(entity).State = EntityState.Modified;

问题是我在覆盖SaveChanges方法中使用状态:

public override int SaveChanges()
{
    var context = ((IObjectContextAdapter)this).ObjectContext;

    var objectStateEntries =
        context.ObjectStateManager
        .GetObjectStateEntries(EntityState.Added | EntityState.Modified);
    ...
    return base.SaveChanges();
}

..在调试时,我可以看到我的实体的状态是Unchanged

1 个答案:

答案 0 :(得分:3)

如果您尚未停用change tracking of EFproxy creation,那么您不应该对该更新有任何疑问。当您的实体符合您在此msdn page中可以找到的要求时,默认情况下EF会自动更改。如果您满足这些要求并稍后通过Single扩展方法返回一次实体类型,您将看到这是一个代理类,而不是您的真实类。因此,首先检查您是否满足EF需要自动跟踪更改的所有要求,您可以使用该代码。

要创建其中任何一个代理:

  • 必须使用public访问权声明自定义数据类。

  • 自定义数据类不得为sealed

  • 自定义数据类不得为abstract

  • 自定义数据类必须具有公共或受保护的构造函数 没有参数。使用受保护的构造函数 参数,如果您希望使用CreateObject方法来创建 POCO实体的代理。调用CreateObject方法不会 保证代理的创建:POCO类必须遵循 本主题中描述的其他要求。

  • 该课程无法实现IEntityWithChangeTracker或。{ IEntityWithRelationships接口因为代理类 实现这些接口。

  • ProxyCreationEnabled选项必须设置为true。

对于更改跟踪代理:

  • 映射到实体类型属性的每个属性 数据模型必须没有密封, 公开,virtual获取和设置 访问器。

  • 一个导航属性,代表"很多"结束了 relationship必须返回一个实现ICollection的类型,其中T 是关系另一端的对象类型。

  • 如果您希望与对象一起创建代理类型,请使用 创建新文件时CreateObject上的ObjectContext方法 对象,而不是新的运算符。