C# 实体框架在更新时未更改EnityState
我有一个有效的C# 实体框架在更新时未更改EnityState,c#,entity-framework,self-tracking-entities,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保持“不变”。有没有想过为什么?我试
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();
}
…调试时,我可以看到我的实体的状态是未更改
如果您没有禁用or,那么您应该不会对该更新有问题。默认情况下,当您的实体满足本文档中的要求时,EF将自动跟踪更改。如果您满足这些要求,并在稍后检查由Single
扩展方法返回的实体类型,您将看到这是一个代理类,而不是真正的类。所以,首先检查您是否满足EF自动跟踪您的更改所需的所有要求,您会对这些代码感到满意
对于要创建的任何一个代理:
- 必须使用
public
access声明自定义数据类
- 自定义数据类不能
密封
- 自定义数据类不能是抽象的
- 自定义数据类必须具有
没有参数。使用受保护的构造函数而不使用
如果希望使用
CreateObject
方法创建
POCO实体的代理。调用CreateObject
方法不会
保证代理的创建:POCO类必须遵循
本主题中描述的其他要求
- 该类无法使用ChangeTracker实现
IENTITY
或
IEntityWithRelationships
接口,因为代理类
实现这些接口
ProxyCreationEnabled
选项必须设置为true
对于更改跟踪代理:
- 映射到中实体类型的属性的每个属性
数据模型必须是非密封的,
公共和
虚拟
获取和设置
访问者
- 一种导航属性,表示一个对象的“多”端
关系必须返回实现
ICollection
的类型,其中T
关系另一端的对象类型
- 如果希望代理类型与对象一起创建,请使用
创建新对象时,
ObjectContext
上的CreateObject
方法
对象,而不是新运算符
如果您没有禁用or,则该更新不应该有问题。默认情况下,当您的实体满足本文档中的要求时,EF将自动跟踪更改。如果您满足这些要求,并在稍后检查由Single
扩展方法返回的实体类型,您将看到这是一个代理类,而不是真正的类。所以,首先检查您是否满足EF自动跟踪您的更改所需的所有要求,您会对这些代码感到满意
对于要创建的任何一个代理:
- 必须使用
public
access声明自定义数据类
- 自定义数据类不能
密封
- 自定义数据类不能是抽象的
- 自定义数据类必须具有
没有参数。使用受保护的构造函数而不使用
如果希望使用
CreateObject
方法创建
POCO实体的代理。调用CreateObject
方法不会
保证代理的创建:POCO类必须遵循
本主题中描述的其他要求
- 该类无法使用ChangeTracker实现
IENTITY
或
IEntityWithRelationships
接口,因为代理类
实现这些接口
ProxyCreationEnabled
选项必须设置为true
对于更改跟踪代理:
- 映射到中实体类型的属性的每个属性
数据模型必须是非密封的,
公共和
虚拟
获取和设置
访问者
- 一种导航属性,表示一个对象的“多”端
关系必须返回实现
ICollection
的类型,其中T
关系另一端的对象类型
- 如果希望代理类型与对象一起创建,请使用
创建新对象时,
ObjectContext
上的CreateObject
方法
对象,而不是新运算符
在调用SaveChanges之前,状态在调用SaveChanges之后被修改,状态在“entity.Name=Name;”行之后保持不变,但在“context.SaveChanges();”之后,状态应再次保持不变。@CyrilIselin不是。请参阅更新。在调用SaveChanges之前,状态在调用SaveChanges之后被修改,状态在“entity.Name=Name;”行之后保持不变,但在“context.SaveChanges();”之后,状态应再次保持不变。@CyrilIselin不是。请参阅更新。我不喜欢更改默认配置/添加额外代码,只是想了解为什么EF不更改EntityState
您是否检查了您的实体是否满足EF创建代理类所需的要求?请查看我在回答中引用的msdn页面。如果默认设置为ProxyCreationEnabled=true
,则确实如此。不,我不是指这个。您的实体应该满足一些条件来创建代理c