0

У меня есть аналогичная проблема.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 и запустить один и тот же фрагмент кода, и он работал нормально, и оба объекта имели нужные свойства. Так почему же этот подход терпит неудачу? И как это сделать? Опять же, я не хочу присоединяться к энтитам через их свойства навигации.

Спасибо!

ответ

0

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

Я использую EF 4 btw.

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

0

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

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

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

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

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

Смежные вопросы