2009-08-15 40 views
0

我有很多表,其中一些表與其他表有很多關係。我注意到,有一個關係,我能夠做什麼它的NerdDinner章顯示錶1Linq to Sql中的外鍵關係問題

Dinner dinner = db.Dinners.Single(d => d.DinnerID == 1); 
RSVP myRSVP = new RSVP(); 
myRSVP.AttendeeName = "ScottGu"; 

dinner.RSVPs.Add(myRSVP); 

所以,當我嘗試類似的東西。新增一直沒有出現對我來說,除非它有一個像一個關係。

那麼,如何讓它適用於多個?

我還不清楚這是什麼讓我無論如何。喜歡它保存在打字?或者是什麼?

+1

一定要在http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-檢查一下Scott Guthrie的LINQ到SQL教程1.aspx – 2009-08-15 15:03:09

回答

4

OK,讓我們試着讓這個更清楚一點:這裏是你提到它在您的文章基本的NerdDinner模式:

alt text http://i31.tinypic.com/nejqmu.jpg

你是否將有一個「回函」的問題你可以添加實體的樣式屬性(一個「EntitySet」)並不取決於你是否有一個或多個關係 - 這取決於你所處的關係的哪一端。

父表(這裏:晚餐)通常具有0,1,或更多的子條目中子表(這裏:RSVP)。

所以在父表中,你必須有一個屬性「RSVPs」,允許你存儲多個實體 - 一個實體集

但是,從子表中,孩子只能與父母完全關聯 - 因此,您只有一個名爲「Dinner」的實體(此RSVP旨在用於此晚餐)。

您可以看到清楚的,當你點擊兩個實體之間的線,看它的屬性:

alt text http://i31.tinypic.com/2f07our.jpg

的「基數」一到多隻定義了這一點:家長有很多孩子,但一個孩子只有一個父母。

因此,在你的代碼,你就可以這樣寫:

 NerdDinnerDataContext ctx = new NerdDinnerDataContext(); 

     Dinner upcomingDinner = new Dinner(); 
     upcomingDinner.EventDate = new DateTime(2009, 10, 10); 
     upcomingDinner.Address = "One Microsoft Way, Redmond, WA"; 
     upcomingDinner.ContactPhone = "(555) 123 1234"; 

     upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "ScottGu" }); 
     upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "ScottHa" }); 
     upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "PhilHa" }); 


     RSVP scottHunter = new RSVP(); 
     scottHunter.AttendeeName = "Scott Hunter"; 
     scottHunter.Dinner = upcomingDinner; 

父(晚餐)的回函(一EntitySet的,集合是準確的,在LINQ到SQL術語),因此你可以有

 upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "ScottGu" }); 

。另一方面,孩子財產「RSVP」只能恰好與一個晚餐相關聯,因此它不具有EntitySet的,但公正的單個實例「晚餐」建立連接,你會寫:

 scottHunter.Dinner = upcomingDinner; 

這是否使事情變得更清楚一點?這實際上是關係數據庫建模的基礎知識,以及如何將父表和子表彼此關聯 - 由Linq-to-SQL轉換爲對象以及它們如何連接和關聯。

馬克

+0

單關係船舶實體?不知道那是什麼,但我認爲我有一些0.1的關係。我怎麼知道。 mssql 2005中的圖表只顯示主鍵或1到多個。 – chobo2 2009-08-15 07:21:39

+0

我想我現在得到更多。現在使用RSVP,您不必添加DinnerId。我不是100%確定最後幾條線,特別是與scottHunter.Dinner = comingDinner ;.你爲什麼要把所有正在參加RSVP的人都加入RSVP的人呢?或者這會製作一個Dinner對象並添加「Scott Hunter」作爲主持人並填寫其他字段。 – chobo2 2009-08-15 18:06:59

+0

隨着ScottHunter計劃參加的晚宴,將「Dinner」設置爲「ScottHunter」將分配此晚餐。它將建立ScottHunter和「即將到來的晚餐」之間的聯繫。從「comingDinner」中,您現在將在其「RSVPs」EntitySet中看到一個新的「RSVP」對象,名爲ScottHunter - 他已被添加到與會者列表中。從ScottHunter RSVP對象中,您將看到「UpcomingDinner」作爲他計劃參加的相關晚宴。它總是一個雙向聯繫! – 2009-08-16 08:44:59

0

您需要爲關係中的每個表添加一個。

Add方法將一個對象放入Linq to SQL數據上下文中,以便將其添加到其對應的數據庫表中。 SubmitChanges方法將任何待處理的更改保存到數據庫。所以你可以做所有的增加,然後立即提交它們。

+0

請你舉個例子。我不是跟着我一直在做sql的linq,因爲現在5分鐘了。所以我不知道如何製作這些添加方法,但仍然沒有100%清晰。 – chobo2 2009-08-15 07:08:15