Вставляя несколько связанных сущностей в БД с помощью Entity Framework, что я делаю не так? - PullRequest
0 голосов
/ 17 марта 2009

У меня есть 3 объекта

  • Принтер
  • Сервер
  • Driver

Принтер имеет свойства сервера и драйвера

Где-то в моем коде я настроил IEnumerable , где каждый экземпляр принтера содержит свои собственные сущности Server и Driver.

Теперь, когда я пытаюсь отправить его в базу данных, я использую следующий код:

foreach (Printer p in printers)
  {
   printmanEntities _dc = new printmanEntities();
   p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver;
   p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server;

   _dc.AddToPrinterSet(p);

   _dc.SaveChanges();  
   }

Предполагается, что я получу запись для каждого объекта «Принтер» и одну запись для каждого уникального имени драйвера и сервера. Но фактический результат вполне зашит.

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

Кроме того, если я сначала назначу p.Server, то получу только уникальные записи для сущностей сервера, но несколько записей для сущностей драйвера.

Что я делаю не так?

Обновление: заменил EF на LINQ2SQL, и все заработало так, как я ожидал. Отдельная строка для каждого уникального объекта, не более того.

Ответы [ 2 ]

0 голосов
/ 15 января 2010

Как ни странно, DataContainer не возвращает сущности, которые вы прикрепили к графу, но не зафиксировали db в качестве результата запроса. Таким образом, вы не можете получить сущность, которую добавили, но не разрешили с помощью Select (). ) -

0 голосов
/ 17 марта 2009

Это говорит о том, что dc.ServerSet.FirstOrDefault (s => s.Name == p.Server.Name) возвращает ноль, но вызов Driver возвращает запись. Зачем? Я не знаю. Посмотрите на SQL Profiler и посмотрите, что возвращается с сервера БД. Хотя это объяснило бы ваши результаты.

Обновление: Думаю, я понял, что здесь происходит. Попробуйте изменить свой код следующим образом. Если это сработает, я объясню причину.

printmanEntities _dc = new printmanEntities();
_dc.AddToPrinterSet(p);

p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver;
p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server;

_dc.SaveChanges();  

Обратите внимание, что единственное, что я здесь сделал, - изменил порядок операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...