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 выполнил всю работу за вас, либо перезагрузите заказ.