0

我有類似的問題。實體框架/ EF4:在事務處理中插入多個相關實體

我想在同一個transactionscope中創建兩個插入。這些對象是相關的,並且它們之間具有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關係並運行完全相同的代碼,並且它運行良好,並且兩個對象都具有正確的屬性集。那麼爲什麼這種方法會失敗呢?而應該怎麼做呢?同樣,我不想通過導航屬性附加這些實體。

謝謝!

回答

0

我會離開數據庫中的FK關係,但從SSDL中刪除AssociationSet和Association。設計者不會讓你這樣做,你必須手動編輯XML。

我使用EF 4 btw。

然後在您的SaveNew方法中使用AddObject和SaveChanges添加第一個(父)對象。在子項上設置外鍵屬性並將其添加到AddObject和SaveChanges中。

0

我沒有開發環境中運行,以測試這一點,但我認爲正在發生的事情是:

假設該ID在數據庫中生成。在您保存訂單時,您不知道該ID。

然後,訂單明細的訂單ID設置爲訂單的ID,但訂單未從數據庫重新加載。我懷疑這個值是0.

當您嘗試使用FK爲0保存訂單明細時,您會收到錯誤消息。

既可以同時保存,以便EF爲您完成工作或重新下載訂單。