2009-05-28 82 views
14

我正在使用事務來在多個表中插入多行。對於這些行,我想按順序添加這些行。在調用SaveChanges時,所有的行都是亂序插入的。行插入順序實體框架

當不使用事務並在每次插入後保存更改確保訂單,但我確實需要所有條目的事務。

+1

爲什麼插入SQL數據庫的順序很重要? – 2009-05-28 15:33:13

+5

插入順序並不重要,但主鍵的順序確實如此。 – Wouter 2009-06-03 12:55:56

回答

9

實體框架中的訂單插入/更新和刪除取決於實體框架中的許多事情。

例如,如果您將新產品插入新類別,我們必須在產品之前添加類別。

這意味着如果您有一大組更改,那麼我們必須首先滿足局部排序約束,事實上這就是我們所做的。

您在上下文中執行操作的順序可能與這些規則衝突。例如,如果你這樣做:

ctx.AddToProducts(
    new Product{ 
     Name = "Bovril", 
     Category = new Category {Name = "Food"} 
    } 
); 

的效果是產品添加(上下文)第一,然後當我們走路上圖我們添加範疇了。

即插入順序進入上下文是:

Product 
Category 

但由於參照完整性約束,我們必須試圖插入到數據庫中之前重新排序是這樣的:

Category 
Product 

所以這本地重新排序是一種不可談判的方式。

但是,如果沒有這樣的本地依賴關係,理論上可以保持排序。不幸的是,我們目前沒有跟蹤'何時'添加到上下文中,出於效率的原因,我們不會跟蹤實體以保留像列表這樣的結構。因此,我們目前無法保留不相關插入的順序。

不過我們剛纔是在辯論這個,所以我很想看看這對你有多重要?

希望這有助於

亞歷

項目經理實體框架團隊

+0

感謝您的解釋。如果支持,它肯定會節省我一些時間,但我想我也可以生成我自己的自定義主鍵以達到相同的效果。 – Wouter 2009-06-03 12:54:11

1

我在穿越這座橋的過程中來的。我正在用EF替換NHibernate,並且我正在運行的問題是如何將列表插入到數據庫中。如果我將項目添加到列表中(在pseduo代碼中):

list.Add(testObject); list.Add(testObject1);

我目前不保證在運行'SaveChanges'時得到相同的訂單。這很遺憾,因爲我的列表對象(即鏈表)知道它的創建順序。使用引用鏈接在一起的對象必須以相同的順序保存到數據庫中。不知道你爲什麼提到你在「辯論」這一點。 =)