Нужно ли вручную устанавливать свойства внешнего ключа при изменении связей?
Я перехожу с Linq-to-SQL на Entity Framework (4.4), используя Database First с DbContext. Мне интересно, нормально ли следующее поведение:
using (var e = new AgendaEntities()) {
var store = e.Stores.First();
var office = e.Offices.Create();
office.Store = store; // Set association
Console.WriteLine(office.StoreID); // shows Guid.Empty, expected store.ID!
}
В L2S настройкаStore
ассоциация с объектом также обновитStoreID
ключ. В EF этого не происходит. Это независимо от того, являются ли объекты новыми или загруженными из контекста.
Когда яSaveChanges
, он сохраняет правильно иStoreID
обновляется, чтобы соответствоватьoffice.ID
, но почему это происходит только после сохранения?
Что-то мне не хватает, или я теперь должен синхронизировать внешние ключи вручную?
Решение Редактировать: Это называется фиксацией свойств и используется автоматически сгенерированными прокси. Однако сDbContext
это больше не так. Согласно сэта проблема подключенияэто по замыслу.
Здравствуйте, шаблон DbContext на самом деле не генерирует классы, которые будут использоваться в качестве прокси отслеживания изменений - просто ленивые загрузочные прокси (которые не исправляют). Мы приняли это решение, потому что прокси отслеживания изменений сложны и имеют много нюансов, которые могут очень запутать разработчиков. Если вы хотите, чтобы исправление произошло до SaveChanges, вы можете вызвать myContext.ChangeTracker.DetectChanges. ~ EF Team
Альтернатива - позвонитьDbContext.Entry(entity)
, который будет синхронизировать сущность. Это описано в этой статье:Отношения и свойства навигации в разделе «Синхронизация изменений между FK и свойствами навигации»