2010-08-23 118 views
0

我正在使用實體框架與MySQL服務器,因爲我希望能夠很好和簡單的LINQ查詢againy我的MySQL數據庫。 我有一個非常簡單的問題,我很沮喪,因爲我無法相信EF正在犯這樣一個可怕的錯誤。如何讓EF按照正確的順序執行Insert Queries?

爲了簡化,我有父類和子類,並且我想在一個事務中執行兩個插入。

爲了演示:我有A,B,C和D. A是B和C的父親,B和C是D的父母(它需要像那樣)。

我做到以下幾點:

B b = new B() { B_ID = 1 }; 
A.Bs.Add(b); 
C.Ds.Add(new D() { B_ID = b.B_ID }); 

我做這種方式,因爲這一切實際上是C級內發生。 爲什麼我得到一個UpdateException('...'中的實體參與'BD'關係,找到0個相關的'B',預計1'B')?因爲當我遺漏了最後一條命令(插入D,B的子節點)時,它工作正常,並且在我之後發出插入(即在新事務中)時,它也可以正常工作。

難道EF是以一種隨機的順序盲目地插入元素,但是注意到它不可能是?還是我以完全錯誤的方式接近問題?

EF版本:我有.NET FX 3.5 SP1,所以從我知道它是什麼版本1

更新:非常抱歉,追查錯誤的錯誤,我做,所以現在錯誤不會發生在EF級別(除了我上面說的例外),但實際上chidl元素的INSERT被髮送到DB,我可以在日誌中看到它。所以問題仍然存在,但異常是不同的(外鍵約束失敗)。

感謝你的幫助, 邁克爾

(編輯回答評論)

+0

哪個版本的EF? – 2010-08-23 12:27:57

+0

正如我現在發佈的,我認爲它是版本1. – Michael 2010-08-23 12:34:03

回答

0

後試圖圍繞小時,我想我已經取得了突破。這需要更多的測試,但我發現EF可以比VARCHAR(n)更好地處理INT關係。儘快知道它會更新這個答案。

只是雖然別人會掙扎,以及...

編輯:是的,絕對。對於我的配置(EF1/MySQL),如果父項(和子項的外鍵)的主鍵是VARCHAR,則EF首先放入子INSERT。我嘗試了VARCHAR(120)和VARCHAR(255),都沒有工作。

2

是否b.B_ID代表(這是由數據庫自動生成或其它ID)標識列?如果是這樣,那麼在插入操作發生之前它將不具有可用值。在這種情況下,您必須使用對象引用而不是數據庫標識符來設置關係的一側。

或者:

C.Ds.Add(new D() { B = b }); 

或者

b.Ds.Add(new D()); 
+0

b.B_ID是一個關鍵列,但價值是可用的,因爲我實際上是在構建B後設置它(這是「......」派對,將改變原帖,抱歉) – Michael 2010-08-23 12:32:56

+0

@Michael:你有沒有試過我提出的建議之一?我並不是說你的方式*不應該工作,但我很好奇,如果其中一個選項允許你將它們插入同一批次中。 – 2010-08-23 12:48:02

+0

@Adam:是的,它幫助我發現我在周圍的代碼中出現了一些非常類似於初學者的錯誤,所以非常感謝你:-)但是現在我仍然堅持INSERTs出錯訂購! – Michael 2010-08-23 12:50:17