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

RPM*_*984 5 c# sql-server entity-framework sql-update entity-framework-4.1

背景:我在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; }
}
Run Code Online (Sandbox Code Playgroud)

当我做INSERT时:

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

一切都很酷,当我检查跟踪时,首先添加用户,然后添加UserSettings - 正如您所期望的那样,因为UserSettings需要来自User的IDENTITY .

但是,当我更新 "SpecialField"时:

var user = ctx.Users.Include("Settings").Single();
user.Name = "Joe";
user.Settings.SpecialField = "Bar";
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

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

为什么?

这对我来说很重要,因为我有触发逻辑,只有在更改了SpecialField时才需要执行,并且需要在User上引用数据.

谁能解释这种行为?是否有一个解决方法(除了黑客 - 这将涉及我手动"再次触摸"特殊领域,这是非常糟糕的).

RPM*_*984 0

作为解决方法,最终再次“接触”该领域。

该死的EF。