Entity Framework / EF4: множественные вставки связанных объектов в область транзакций

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

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

Это упрощение того, чего я хочу достичь:

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 ответа

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

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

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

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

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

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

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

Либо сохраните оба файла одновременно, чтобы EF выполнил всю работу за вас, либо перезагрузите заказ.