【问题标题】:Entity Framework not changing EnityState on Update实体框架在更新时不更改 EnityState
【发布时间】:2016-05-19 01:59:52
【问题描述】:

我有一个有效的Update 方法,它只是更改属性值并在数据库上下文中调用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

【问题讨论】:

  • 在调用 SaveChanges 之前,状态是 MODIFIED 在调用 SaveChanges 之后,状态是 UNCHANGED
  • 在那一行“entity.Name = name;”之后状态应该被修改,但之后是“context.SaveChanges();”它应该再次保持不变。
  • @CyrilIselin 不是。查看更新。

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


【解决方案1】:

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

要创建以下任一代理:

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

  • 自定义数据类不得为sealed

  • 自定义数据类不得为abstract

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

  • 该类无法实现 IEntityWithChangeTrackerIEntityWithRelationships 接口,因为代理类 实现这些接口。

  • ProxyCreationEnabled 选项必须设置为 true。

对于更改跟踪代理:

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

  • 表示“多”端的导航属性 关系必须返回实现 ICollection 的类型,其中 T 是关系另一端的对象的类型。

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

【讨论】:

  • 我不喜欢更改默认配置/添加额外代码,只是想了解为什么 EF 不更改 EntityState
  • 您是否检查过您的实体是否满足 EF 创建代理类所需的要求?检查我在回答中引用的 msdn 页面
  • 确实如此,授予ProxyCreationEnabled=true 是默认值。
  • 不,我不是指那个。您的实体应该满足一些条件才能创建代理类。请阅读 msdn 页面
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多