我有一个工作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
。
答案 0 :(得分:3)
如果您尚未停用change tracking of EF或proxy creation,那么您不应该对该更新有任何疑问。当您的实体符合您在此msdn page中可以找到的要求时,默认情况下EF会自动更改。如果您满足这些要求并稍后通过Single
扩展方法返回一次实体类型,您将看到这是一个代理类,而不是您的真实类。因此,首先检查您是否满足EF需要自动跟踪更改的所有要求,您可以使用该代码。
要创建其中任何一个代理:
必须使用public
访问权声明自定义数据类。
自定义数据类不得为sealed
自定义数据类不得为abstract
。
自定义数据类必须具有公共或受保护的构造函数
没有参数。使用受保护的构造函数
参数,如果您希望使用CreateObject
方法来创建
POCO实体的代理。调用CreateObject
方法不会
保证代理的创建:POCO类必须遵循
本主题中描述的其他要求。
该课程无法实现IEntityWithChangeTracker
或。{
IEntityWithRelationships
接口因为代理类
实现这些接口。
ProxyCreationEnabled
选项必须设置为true。对于更改跟踪代理:
映射到实体类型属性的每个属性
数据模型必须没有密封,
公开,virtual
获取和设置
访问器。
一个导航属性,代表"很多"结束了
relationship必须返回一个实现ICollection
的类型,其中T
是关系另一端的对象类型。
如果您希望与对象一起创建代理类型,请使用
创建新文件时CreateObject
上的ObjectContext
方法
对象,而不是新的运算符。