2010-01-15 103 views
1

我有一個Linq to SQL類。Linq to SQL集合不填充

在我的數據庫中有一對多的關係。

該關係在設計器中正確映射,並且在設計器中創建了EntitySet<>屬性。

當我運行的代碼中,EntitySet<>不與任何數據填充,即使有相關的記錄,他們不填充到EntitySet<>

我缺少某些屬性或設置?我必須自己寫查詢嗎?我覺得我失去了一些明顯的東西。

這裏是設計師代碼:

[Association(Name = "Bar_Foo", Storage = "_Foo", ThisKey = "ID", OtherKey = "BarID")] 
[DataMember(Order = 15, EmitDefaultValue = false)] 
public EntitySet<Foo> Foos 
{ 
    get 
    { 
     if ((this.serializing && (this._Foo.HasLoadedOrAssignedValues == false))) 
     { 
      return null; 
     } 
     return this._Foo; 
    } 
    set 
    { 
     this._Foo.Assign(value); 
    } 
} 

這是我試圖訪問的EntitySet <>代碼:

partial void OnCreated() 
    { 
     foreach (Foo foo in Foos) 
     { 
      foo.DoSomething(); 
     } 
    } 

我的情況的更多信息:

所以,從上面我有一個班級酒吧與Foo的集合。我想要做的是通過WCF服務將Bar傳遞給UI。以下是我的主要服務電話:

public class TheService : ITheService 
{ 
    public List<Bar> GetBars() 
    { 
     try 
     { 
      using (var db = new BarDataContext()) 
      { 
       List<Bar> Bars = new List<Bar>(); 

       Bars = (from B in db.Bars 
          select B).ToList(); 

       return Bars; 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new FaultException(ex.Message + " Something in GetBars() Stack Trace: " + ex.StackTrace); 
     } 
    } 
} 

目前,當服務返回酒吧的每個酒吧內FOOS爲空。

如果我在Bar中查看Foos的屬性,我會得到一個空引用異常。

我嘗試運行在OnCreated方法查詢,以填補FOOS,目前酒吧的ID爲0

更新查詢仍然不能正常工作:

   using (var ctx = new BarDataContext()) 
      { 
       List<Bar> Bars= new List<Bar>(); 

       Bars= (from B in ctx.Bars 
          select B).ToList(); 

       foreach (Bar bar in Bars) 
       { 
        bar.Foos= (from B in ctx.Bars 
           where B.ID == bar.ID 
           select B.Foos).SingleOrDefault(); 
       } 

       return Bars; 
      } 

這當我嘗試從Bar中查詢Foos時,代碼會生成一個空引用異常。

編輯:

上面的代碼神奇不再扔空引用異常,不知道爲什麼。我發現有趣的是,你甚至不需要設置bar.Foos在上面的查詢中,你可以將Foos查詢放入一個永遠不會使用的變量中,它將填充Bar.Foos屬性,僅僅因爲你看了FOOS。讓我想起薛定諤的貓。

+0

你可以發佈你正在使用的代碼,這將有助於很多在這種情況下。 – 2010-01-15 19:06:47

+0

請張貼一些代碼,以便我們可以更好地瞭解問題 – 2010-01-15 19:11:30

回答

0

OnCreated事件適用於單個記錄對象,而不適用於整個EntitySet。它主要用於設置屬性的默認值。

如果您希望檢索結果集,則需要使用查詢來完成。例如:

var result = Foos.Where(a => a.ID == 7).Single(); 

非拉姆達相當於是:

var result = from a in Foos 
      where (a => a.ID == 7) 
      select a; 

編輯

不能使用OnCreated事件填寫欄FOOS財產,爲上述原因。事實上,您不必手動填寫Foos屬性。如果在數據庫中正確定義了外鍵關係,並且已經使用模型設計器來創建DataContext(* .dbml),那麼當您檢索Bar時,Foos屬性應該已經被填充。您只需訪問Bar類中的Foos屬性:

var result = from a in DataContext.Bar 
      where (a => a.ID == 7) 
      select a.Foos; 

此查詢將檢索與#7相關的Foos集合。

+0

我在上面添加了更詳細的解釋 – Eric 2010-01-15 20:42:32

+0

每當我嘗試查詢a.Foos時,都會收到空引用異常,即使我已經通過設計器創建了表關聯在上面的代碼塊中。在我將它傳遞給我的UI層之前,我需要在WCF服務中填充Foos屬性。我會在上面的空參考代碼。 – Eric 2010-01-18 17:44:27