2009-01-11 54 views
4

我想弄清楚在Linq2Sql中保存簡單的一對多關係的最佳方法。在Linq2Sql中保存一對多關係的最佳方式是什麼?

讓我們假設我們有以下的POCO模型(順便說一句pseduo代碼):

人具有零到多個駛出的車輛。

class Person 
{ 
    IList<Vehicle> Vehicle; 
} 

class Vehicle 
{ 
    string Name; 
    string Colour; 
} 

現在,當我保存的人,我傳遞POCO對象到存儲庫代碼(這恰好是L2S)。我可以保存好人物。我通常這樣做。

using (Db db = new Db()) 
{ 
    var newPerson = db.People.SingleOrDefault(p => p.Id == person.Id) ?? new SqlContext.Person(); 
    // Left to right stuff. 
    newPerson.Name = person.Name; 
    newPerson.Age = person.Age; 

    if (newPerson.Id <= 0) 
     db.People.InsertOnSubmit(newPerson); 
    db.SubmitChanges(); 
} 

我不知道我應該在哪裏以及如何處理這個人可能擁有的車輛列表?有什麼建議麼?

回答

4
using (Db db = new Db()) 
{ 
    var newPerson = db.People.SingleOrDefault(p => p.Id == person.Id) ?? new SqlContext.Person(); 
    // Left to right stuff. 
    newPerson.Name = person.Name; 
    newPerson.Age = person.Age; 

    // add vehicles. 
    Vehicle firstV = new Vehicle(); 
    firstV.Name = "some name"; 
    firstV.Person = newPerson; // need to do this to set the person Id on the vehicle. 
    newPerson.Vehicle.Add(firstV); 
    // now when you save the Person it should save the Vehicle list 
    // if you set Cascade save update on the list. (not sure how to do that in L2S 

    if (newPerson.Id <= 0) 
     db.People.InsertOnSubmit(newPerson); 
    db.SubmitChanges(); 
} 

現在,您可以選擇構建另一個級別的車輛列表,以及來自界面的數據。

但是,您需要記住將車輛添加到Person對象的列表中還不夠,還需要將車輛Person屬性設置爲擁有車輛的人員。

觀察我不知道這個,但是當你做 db.People.SingleOrDefault你可能會加載在內存中的整個人表。這不是你想要做的事情。 由Slace在評論中更正。

+0

SingleOrDefault用於提供只能返回1個結果的查詢(即ID比較)。它像所有L2Q操作一樣延遲加載,因爲它是通過IQueryable完成的 2009-01-11 12:15:00

+0

確實,你是正確的。 – sirrocco 2009-01-11 18:46:10

1

您只需確保在數據庫中設置了適當的關係。

如果您的Vehicle表具有PersonId,並且在將它們添加到DBML時將它們之間存在外鍵Linq to SQL將檢測到它們之間存在關係並創建該關係的表示形式Table<T>

相關問題