2010-01-15 60 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