Операция ОБНОВЛЕНИЕ Entity Framework - Почему дочерняя запись обновляется первой? - PullRequest
5 голосов
/ 25 июня 2011

Фон: У меня есть отношения 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();

Все круто, когда я проверяю трассировку, сначала добавляется Пользователь , затем UserSettings - как и следовало ожидать, поскольку UserSettings нужна IDENTITY от пользователя .

Но когда я ОБНОВЛЕН , то "SpecialField":

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

Я вижу, что трассировка показывает, что EF сначала обновляет UserSettings , затем User .

Почему?

Это важно для меня, потому что у меня есть логика триггера, которая должна выполняться только при изменении SpecialField , и она должна ссылаться на данные Пользователь .

Кто-нибудь может объяснить это поведение? Есть ли обходной путь (кроме взлома - который потребовал бы, чтобы я снова вручную «прикоснулся» к специальному полю, что действительно плохо).

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Извините, но я попробовал вашу модель на моем ПК. И все случилось очень хорошо. Сначала пользователь обновляется (родительский), затем пользовательский (дочерний).

Я думаю, это может быть что-то не так с вашей моделью или базой данных, но я не знаю, что.

0 голосов
/ 28 июня 2011

Закончилось "касание" поля снова в качестве обходного пути.

Черт, ЭФ.

...