Entity Framework 更新操作 - 为什么子记录先被更新?

5

背景:我有一个UserUserSettings之间的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();

当我检查追踪记录时,一切都很顺利,首先添加了User,然后是UserSettings - 正如您所预期的,因为UserSettings需要从User获取IDENTITY。

但是当我UPDATE那个“SpecialField”时:

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

我看到跟踪记录显示EF先更新UserSettings,然后是User
为什么会这样呢?
这对我很重要,因为我有触发器逻辑需要仅在SpecialField更改时执行,并且它需要引用User上的数据。
有人能解释这种行为吗?是否有解决方法(除了hack - 这将涉及我手动再次“触摸”特殊字段,这真的很糟糕)。

脑海中浮现出的一个解决方法是在更改“user.Name”后添加对“SaveChanges()”的调用。另外需要注意的是:如果您正在使用EF 4.1(根据标签),最好使用“Include(u => u.Settings)”而不是基于字符串的版本。 - Yakimych
@Yaki - 你的意思是要做两次SaveChanges吗?是的,我正在使用lambda include,这只是一个例子。 - RPM1984
@RPM1984 - 是的,两次。而且这似乎并不是一个坏主意。无论如何,你都将执行两个SQL命令。 - Yakimych
@Yakimych - 是的,我想是这样。这基本上是我最后的选择。那么我看到的这种行为不是标准的吗?比如说我做错了什么? - RPM1984
@RPM1984 - 我认为你没有做错任何事情。为什么你期望表格按照你想要的特定顺序更新呢?有什么特别的原因吗? - Yakimych
显示剩余6条评论
2个回答

1

抱歉,我已经在我的电脑上尝试了您的模型。一切都很顺利。

用户首先更新(父级),然后是用户设置(子级)。

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


0
最终只能通过“触碰”该字段来解决问题。
该死的 EF。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接