小编Fil*_*her的帖子

Entity Framework 4实体,EntityState为Unchanged触发更新

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

我有两张桌子,ADDRESS和PERSON.PERSON可以有多个与其关联的ADDRESS.

这是我正在运行的代码:

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();
Run Code Online (Sandbox Code Playgroud)

正在更新的地址与我正在检索的人员相关联 - 尽管他们没有在代码中以任何方式明确链接.当context.SaveChanges()执行时,我的地址实体的Update sproc不仅会被触发(就像你期望的那样),但是Person实体的Update sproc也是如此 - 即使你可以看到没有对人实体.

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

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


我创建了第二个项目,以确保问题没有发生,因为我当前的项目环境中存在某些问题.

首先,我创建了一个包含Order和OrderDetail表的新数据库.它们之间有一个外键,因此Order可以有多个与之关联的OrderDetail.我还在Order和OrderDetail表上创建了"更新后"DB触发器,在更新记录时更新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 …
Run Code Online (Sandbox Code Playgroud)

entity-framework

6
推荐指数
1
解决办法
1700
查看次数

标签 统计

entity-framework ×1