Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架在更新时未更改EnityState_C#_Entity Framework_Self Tracking Entities - Fatal编程技术网

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