entity-framework - Entity Framework 4 EntityState of Unchanged 触发更新

标签 entity-framework

我正在使用 EF 4,使用 sprocs 为我的实体映射所有 CUD 操作。

我有两个表,地址和人。一个人可以有多个关联的地址。

这是我正在运行的代码:

Person person = (from p in context.People
                             where p.PersonUID == 1
                             select p).FirstOrDefault();

Address address = (from a in context.Addresses
                               where a.AddressUID == 51
                               select a).FirstOrDefault();

address.AddressLn2 = "Test";

context.SaveChanges();

正在更新的地址与我正在检索的人相关联 - 尽管它们在代码中没有以任何方式明确链接。当 context.SaveChanges() 执行时,不仅我的 Address 实体的 Update sproc 被触发(如您所料),Person 实体的 Update sproc 也被触发 - 即使您可以看到没有对人实体。

当我在 context.SaveChanges() 调用之前检查两个对象的 EntityState 时,我看到我的 Address 实体的 EntityState 为“Modified”,而我的 Person 实体的 EntityState 为“Unchanged”。

为什么要为 Person 实体调用 Update sproc?是否有某种设置可以防止这种情况发生?

我创建了第二个项目,以确保问题不会因为我当前项目环境中的某些原因而发生。

首先,我创建了一个包含 Order 和 OrderDetail 表的新数据库。它们之间有一个外键,因此 Order 可以有多个与之关联的 OrderDetail。我还在 Order 和 OrderDetail 表上创建了“更新后”数据库触发器,在更新记录时更新 DateTime 字段。

其次,我创建了一个简单的 WPF 应用程序并创建了一个从我的数据库生成的 ADO.NET 实体模型。

第三,我将代码添加到我的类构造函数中,如下所示:
public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();

      MyEntities context = new MyEntities();

      Order order = (from o in context.Orders
              select o).FirstOrDefault();

      OrderDetail orderDetail = (from d in order.OrderDetails
                    select d).FirstOrDefault();

      orderDetail.Qty = 7;

      context.SaveChanges();
    }
  }

我在没有为 Order 和 OrderDetail 对象做任何函数映射的情况下运行程序。结果正是我所期望看到的,OrderDetail 记录更新为数量为 7,UpdateDateTime 字段填充了更新发生的日期和时间。我的订单记录没有变化,这意味着没有发生更新。

然后我创建存储过程来处理数据库中 Order 和 OrderDetail 表的更新。他们没有做任何特别的事情,只是接受表中每一列的参数,然后将每个字段设置为等于相关参数。然后,我使用映射详细信息(将实体映射到函数)窗口将这些存储过程映射到我的模型对象。

完成映射后,我运行了程序。结果,我观察到了看到 OrderDetail 表更新的预期行为,但此外,Order 表“更新后”触发器已经触发,并且 UdateDateTime 字段设置为更新发生的日期和时间 - 这是我不期望的。

有谁知道一种方法可以将存储过程用于所有插入、更新和删除操作,而不是将更新级联到相关实体?

最佳答案

我遇到了同样的问题,它已被 that MS KBD page 上提到的修补程序解决了.

该修复程序仅在 .NET 4.5 中广泛发布。但是,我希望 EF 6(在 .NET 4/.NET 4.5 上都可以运行)也将提供该修复程序,因为它会取代 .NET 4 附带的 System.Data.Entity.dll 版本。

关于entity-framework - Entity Framework 4 EntityState of Unchanged 触发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2931628/

相关文章:

c# - Entity Framework 查询错过过滤索引 WHERE BIT 字段 = 0

c# - sub linq 查询使这需要很长时间,我怎样才能使它更快?

c# - 如何以编程方式计算 CPU 利用率?

c# - 为什么我的 ASP.NET MVC 4 应用程序创建新实体而不是更新旧实体?

asp.net-mvc - Entity Framework 数据库优先+ uniqueidentity结果没有新的guid id

entity-framework - Entity Framework 4.1 Code First - 未插入计算/计算列

c# - 通过 System.Linq.Expressions.Expression 创建表达式时,LINQ to Entities 无法识别方法 'Boolean HasFlag(System.Enum)'

c# - EF 代码优先向列添加唯一索引

c# - EntityFramework 将新对象添加到集合中

.net - 如何告诉 Entity Framework View 中的列可以为空?