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

本文关键字:更新 记录 框架 操作 实体 为什么 | 更新日期: 2023-09-27 18:00:27

背景:我在用户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; }
}

当我执行插入时:

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

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

但是当我更新"SpecialField"时:

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

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

为什么?

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

有人能解释这种行为吗?有没有变通办法(除了破解——这会让我再次手动"触摸"特殊字段,这真的很糟糕)。

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

对不起,我在电脑上试过你的型号,一切都很顺利。用户首先更新(父级),然后更新UserSetting(子级)。

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

最终再次"触摸"该字段作为解决方法。

该死的EF。