2013-11-14 4 views
1

Я переношу свой проект EF6 MVC из ObjectContext в DbContext с ленивой загрузкой.EF не обновляет связанные объекты в SaveChanges

С ObjectContext, я мог бы сделать следующее:

// Create a new user: 
User u = new User(); 
u.LineManagerID = 42; // Set foreign key 

db.Users.Add(u); 
db.SaveChanges(); 

// get property of related entity as set above by foreign key 
User lm = u.LineManager; 

С DbContext, u.LineManager равно нулю даже новый объект сохраняется правильно, и я подозреваю, что если бы я сделал еще один вызов к базе данных, было бы хорошо.

Доступны ленивые загрузки и динамические прокси.

Почему новый объект не обновляется должным образом?

Пожалуйста, помогите! Я вижу, что эта миграция будет намного сложнее, чем я думал ...!

EDIT - Я хотел бы добавить, что я использую DB-первых генерации коды

+0

Возможный дубликат [Entity Framework: я устанавливаю внешний ключ, SaveChanges затем получает доступ к свойству навигации, но не загружает связанный объект. Почему нет?] (Http://stackoverflow.com/questions/15552891/entity-framework-i-set-the-foreign-key-savechanges-then-access-the-navigation) – Colin

+0

Думаю, вам нужно перейти на db .Users.Attached (пользователь); то вы должны сказать, что что-то обновляете. Это было бы что-то вроде db.Users.Attached (user); db.Entry (пользователь) .State = EntityState.Modified; Кроме того, я не считаю, что вам нужно вручную указать, какой идентификатор обновить. Пока у вас есть ссылка на этого менеджера на ваш взгляд. Например, если у вас есть что-то вроде @ html.EditorFor (model => model.Manager.Name), чтобы захватить имя менеджера, он должен обновить соответствующий столбец. Надеюсь, я делаю сенсацию. –

ответ

9

Вы должны сделать LineManager свойства virtual быть переопределением ленивой загрузки прокси-сервером. (который уже есть благодаря генерации кода)

Когда вы создаете объект непосредственно с помощью new, вы, к сожалению, просто создаете простой объект, а не прокси-сервер со всеми ленивыми функциями загрузки. Для того, чтобы получить те, что вам нужно использовать фабричный метод для создания объекта:

User u = db.Users.Create(); 

Я сделал некоторые эксперименты с навигационными свойствами и внешними ключами, которые я документированных в blog post.

+0

Извините Anders - только что внесли некоторые изменения в мой вопрос, который может изменить ваш ответ. – rwalter

+0

Также я использую db-first, поэтому я не должен добавлять «виртуальный» или что-то еще в код, который автоматически генерируется. – rwalter

+0

Ну, это правильно - я только что обновил свой ответ с решением реальной проблемы - сначала не видел. –