2010-07-22 48 views
2

這是我昨天問的跟進問題this question。我仔細追蹤了我認爲導致我悲傷的問題,我想我可以更清楚地解釋情況。如何使用實體框架提交具有多對多關係的對象?

我似乎無法弄清楚如何使用C#ASP.NET MVC 2項目中的實體框架編寫具有與SQL數據庫的多對多關係的對象。

這裏是我的嘗試:

我有隻有兩個表一個非常簡單的數據庫。愛好與列的名稱和說明和人與列名和姓。我創建了一個默認的.edmx與所有選定的。 (兩者也使用int作爲主鍵(HobbieID,是PersonID),我在設計成可自動遞增數據庫中設置。)

我可以再使用成功以下代碼:

SampleEntities entities = new SampleEntities(); 
Hobby h1 = new Hobby() { Name = "Tennis", Description = "Not golf" }; 
Person p1 = new Person() { First = "Jack", Last = "Black" }; 
entities.Hobbies.AddObject(h1); 
entities.People.AddObject(p1); 
entities.SaveChanges(); 

果然兩者都正確添加到數據庫中。現在它破裂了。

我添加另一個表名爲JunctionHobbiesPeople的數據庫,它有兩列(HobbieID,PersonID),我使用數據庫設計器中的關係彈出窗口創建外鍵。然後,我將JunctionHobbiesPeople表添加到實體設計器(通過右鍵單擊更新,使用GUI),並以圖形方式顯示正確的多對多關係。

然後我嘗試下面的代碼:

SampleEntities entities = new SampleEntities(); 
Hobby h1 = new Hobby() { Name = "Tennis", Description = "Not golf" }; 
Person p1 = new Person() { First = "Jack", Last = "Black" }; 
p1.Hobbies.Add(h1); 
entities.People.AddObject(p1); 
entities.SaveChanges(); 

的第一個錯誤我得到的是約DefiningQuery。我可以通過從.edmx文件後面的代碼中的xml中刪除所有DefiningQuery元素來解決這個問題。說到這一點,作爲一個側面問題,這個要素是什麼 - 我不應該刪除它嗎?

之後錯誤消失,我得到以下錯誤:

InnerException {"Invalid object name 'ModelStoreContainer.JunctionHobbiesPeople'."} System.Exception {System.Data.SqlClient.SqlException} 

任何想法就是我做錯了嗎?我是否需要特別訂購它們?我如何獲得多對多關係以正確寫入數據庫?

感謝您的幫助!

+1

我會問你關於你以前的問題的同一個問題:你在JunctionHobbiesPeople上有一個* real * PK嗎? – 2010-07-22 20:32:19

+0

我不知道我明白 - 一個真正的PK?這些列顯示了鍵符號以顯示它們已被標記爲主鍵,並且在Junction表存在之前向表中添加數據時它會自動遞增。還有什麼我需要做的嗎? – Evan 2010-07-22 20:55:00

+1

@evan - 我認爲Craig在數據庫中談論的不僅僅是EF設計師。如果你只做了兩張表「愛好和人」,然後在他們之間建立了多對多的關聯呢? – TheCloudlessSky 2010-07-22 22:47:26

回答

5

我想你已經解決了這個,因爲你在2010年發佈,無論如何這可能會幫助別人:) 我有使用MVC3相同的問題。架構之前 我原來的EDMX文件有一行是這樣的:

<EntitySet Name="StockUpdates" EntityType="SwebotModel.Store.StockUpdates" store:Type="Tables" store:Schema="dbo" store:Name="StockUpdates"/> 

爲了解決這個問題,我改變成這樣:

<EntitySet Name="StockUpdates" EntityType="SwebotModel.Store.StockUpdates" store:Type="Tables" Schema="dbo"/> 

刪除店:名稱和「存儲」。