实体框架更新操作 - 为什么首先更新子记录?

时间:2011-06-25 10:19:07

标签: c# sql-server entity-framework entity-framework-4.1 sql-update

背景用户 UserSettings 之间存在 1到0..1 关系。

该模型的重要部分如下:

public class User
{
   public int UserId { get; set; }
   public string Name { get; set; }
   public UserSettings Settings { get; set; }
}

public class UserSettings
{
   public int UserId { get; set; } // PK/FK
   public sting SpecialField { get; set; }
}

当我执行 INSERT

var user = new User { Settings = new UserSettings { SpecialField = "Foo" }};
ctx.Users.Add(user);
ctx.SaveChanges();

一切都很酷,当我检查跟踪时,首先添加用户,然后添加用户设置 - 因为用户设置需要用户的IDENTITY。

但是当我更新那个“SpecialField”时:

var user = ctx.Users.Include("Settings").Single();
user.Name = "Joe";
user.Settings.SpecialField = "Bar";
ctx.SaveChanges();

我看到跟踪显示EF首先更新 UserSettings ,然后是用户

为什么?

这对我来说非常重要,因为我的触发逻辑只有在 SpecialField 发生变化时才需要执行,并且需要引用用户上的数据。

任何人都可以解释这种行为吗?是否有一个解决方法(除了黑客 - 这将涉及我手动“再次触摸”特殊字段,这是非常糟糕的。)

2 个答案:

答案 0 :(得分:1)

抱歉,我已经在我的电脑上试过你的模型了。一切都很顺利。 首先是用户更新(Parent),然后是UserSetting(Child)。

我认为,您的模型设置或数据库设置可能有问题,但我不知道是什么。

答案 1 :(得分:0)

再次结束“触摸”该领域作为解决方法。

该死的EF。