Entity Framework - добавление новых элементов через свойство навигации - PullRequest
2 голосов
/ 12 июня 2010

Я сталкивался с тем, что кажется очень странным поведением при использовании структуры сущностей 4.0.

У меня есть сущность Пользователь, у которой есть Компания (Компания имеет много Пользователей).

ЕслиЯ делаю это, все работает, как и ожидалось, и я получаю замечательного нового пользователя в базе данных:

var company = _model.Companies.First();
company.Users.Add(new User(1, "John", "Smith"));
_model.SaveChanges();

Однако, если я делаю это, то я ничего нового не получаю в базе данных, и никаких исключений не выдается:

var existingUser = _model.Users.First();
var company = existingUser.Company;
company.Users.Add(new User(1, "John", "Smith"));
_model.SaveChanges();

Получается, что если я добавлю в компанию пользователя, который извлечен непосредственно из модели, то все будет работать нормально.Однако, если Пользователь добавлен в Компанию, которая извлекается как свойство навигации другого объекта, он не работает.

Может кто-нибудь сказать мне, является ли это ожидаемым поведением, или если есть что-то, что я могусделать, чтобы это было так, чтобы это было?

Спасибо!

Редактировать

Чтобы уточнить, что я имею в виду под "это не работает";

  • При просмотре кода указатель выполнения проходит все строки без исключения.
  • Новая строка не добавляется в базу данных
  • Если я проверяю company.Users в режиме быстрого просмотра,новый пользователь действительно был добавлен в компанию - он просто не сохраняется в базе данных.

Я немного поиграл, и, похоже, если я сделаю это, я получуисключение:

var existingUser = _model.Users.First();
var company = existingUser.Company;
_model.ObjectStateManager.GetObjectStateEntry(company);

Исключение:

System.InvalidOperationException: ObjectStateManager не содержит ObjectStateEntry со ссылкой на объект типа 'ABC.DEF.Company'.

Doing that для первого (рабочего) сценария возвращает мне ObjectStateEntry без исключения.

Ответы [ 2 ]

1 голос
/ 12 июня 2010

В EF2 произошла отложенная загрузка сущностей. Я не знаю, если Microsoft изменила это в EF4. Это означает, что existingUser.Company равно null после загрузки existingUser. Есть несколько решений:


var existingUser = _model.Users.Include("Company").First();
var company = existingUser.Company;
...

или


var existingUser = _model.Users.First();
existingUser.CompanyReference.Load();
var company = existingUser.Company;
...

Пожалуйста, примите во внимание, что эти возможности являются некоторыми способами, которые я знаю из старого EF.

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

Привет.

0 голосов
/ 13 июня 2010

Я понял это ...

Я упростил код для целей этого вопроса, но когда я углубился в него, я понял, что экземпляр _model, от которого я получал пользователя, отличаетсятот, который спасал компанию.Так что на самом деле то, что я делал, было чем-то вроде этого:

var existingUser = _modelFromUserDAL.Users.First();
var company = existingUser.Company;
company.Users.Add(new User(1, "John", "Smith"));
_modelFromCompanyDAL.SaveChanges();
...