Entity Framework / EF4: множественные вставки связанных объектов в область транзакций - PullRequest
0 голосов
/ 20 августа 2010

У меня похожая проблема.

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

Это упрощение того, что я хочувыполнить:

Order o = new Order();
OrderDetails d = new OrderDetails();
new Repository().SaveNew(o, d);

class Repository{

void SaveNew(Order o, OrderDetails d){
  using (TransactionScope transaction = new TransactionScope())
  {
   _context.Connection.Open();

   // order
   _context.Orders.ApplyChanges(o);
   _context.SaveChanges();

    // details
    d.OrderID = o.ID;
    _context.OrderDetails.ApplyChanges(d);
    _context.SaveChanges(); <--- UpdateException

    _context.Connection.Close();
    transaction.Complete();
  }
 }
}

Проблема в том, что я получаю исключение UpdateException, поскольку оценка FK не выполняется.Я попытался удалить отношение FK и запустить точно такой же кусок кода, и он работал нормально, и у обоих объектов были установлены правильные свойства.Итак, почему этот подход терпит неудачу?И как это сделать вместо этого?Опять же, я не хочу прикреплять объекты через их свойства навигации.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 октября 2010

У меня не запущена среда разработки, чтобы проверить это, но я думаю, что происходит:

Предполагается, что идентификатор генерируется в базе данных.В тот момент, когда вы сохраняете заказ, вы не знаете его идентификатор.

Тогда идентификатор заказа детали заказа устанавливается равным идентификатору заказа, но заказ не был повторно загружен из базы данных.Я подозреваю, что значение равно 0.

Когда вы пытаетесь сохранить детали заказа с FK, равным 0, вы получаете сообщение об ошибке.работать на вас, или перезагрузить заказ.

0 голосов
/ 02 октября 2010

Я бы оставил отношение FK в базе данных, но удалил AssociationSet и Association из SSDL. Дизайнер не позволит вам сделать это, вы должны отредактировать XML вручную.

Я использую EF 4, кстати.

Затем используйте AddObject и SaveChanges в вашем методе SaveNew, чтобы добавить первый (родительский) объект. Установите свойство внешнего ключа для дочернего элемента и добавьте его с помощью AddObject и SaveChanges.

...