2011-11-01 131 views
2

我是EF4的新手,我試圖從多對多關係中插入一條記錄。我得到3個表:實體框架4 - 插入多對多

  • A(ID,說明)
  • B(ID,碼)
  • AB(AID,BID)< --a和B關係

問題當我調用SaveChanges()時,它會拋出一個異常,它試圖向B中插入一條新記錄。我不希望這樣,它應該只是添加鏈接。這裏是我的代碼:

var a = new A(){Description="Example"}; 

var b = context.B.Single(B => B.ID == paramID); 

a.B.Add(b); 

context.A.AddObject(a); 

context.SaveChanges() <---- here it throws the exception 

從我的研究,上面的代碼應該和一個新的記錄,以A和創建A和B之間的鏈接,並將其存儲在AB表,對不對?

我錯過了什麼?

編輯:

這是我收到的例外:

無法將NULL值插入列 'MIC',表 'dbo.B';列不允許有空值。 INSERT失敗。\ r \ n聲明已終止。

如果你注意到,我只是想添加多對多的鏈接而不是在表B中創建一條新記錄。我甚至試圖讓a.B留空,它仍然拋出上面描述的異常。

+2

異常類型和消息似乎與此問題有關... – driis

回答

2

你可以嘗試安裝A上下文添加B到集合前:

var a = new A { Description = "Example" }; 
var b = context.B.Single(B => B.ID == paramID); 

context.A.AddObject(a); 
a.B.Add(b); 

context.SaveChanges(); 

不幸的是我沒有機會,現在來測試這一點,但我的猜測是,添加A上下文時,EF也將B集合中的對象的狀態設置爲Added。在這種情況下,這應該可以解決問題。

您也可以試試輪走另一條路 - 添加AB名單:

var a = new A { Description = "Example" }; 
var b = context.B.Single(B => B.ID == paramID); 

b.A.Add(a); 

context.SaveChanges(); 

這似乎就像在你的情況下,更簡潔的方法。

+0

最後的建議解決了一切! – Mauro

+0

在嘗試添加...之前,您可能想要檢查鏈接表中的記錄是否已存在(即,將Single更改爲SingleOrDefault,然後只在b爲空時添加...) – AshesToAshes