Linq to SQL集合不会填充

时间:2010-01-15 19:01:10

标签: .net sql linq linq-to-sql

我有一个Linq to SQL类。

我的数据库中存在一对多的关系。

关系在设计器中正确映射,并在设计器中创建EntitySet<>属性。

当我运行代码时,EntitySet<>不会填充任何数据,即使有相关记录,它们也不会填充到EntitySet<>

我错过了一些财产或设置吗?我是否必须自己编写查询?我觉得我错过了一些明显的东西。

以下是Designer代码:

[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&lt;&gt;:

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

有关我的情况的更多信息:

所以,从上面我有一个带有Foo集合的类Bar。我想要做的是通过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);
        }
    }
}

目前,当服务返回Bars时,每个Bar内的Foos为空。

如果我在Bar中创建一个查看Foos的属性,我会得到一个空引用异常。

我尝试在OnCreated方法中运行查询来填充Foos,当前Bar的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。让我想起了薛定谔的猫。

1 个答案:

答案 0 :(得分:0)

OnCreated事件适用于单个记录对象,而不适用于整个EntitySet。它主要用于设置属性的默认值。

如果要检索结果集,则需要使用查询来执行此操作。例如:

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

非lambda等价物将是:

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

修改

由于上述原因,您无法使用OnCreated事件来填充Bar中的Foos属性。事实上,您根本不必手动填充Foos属性。如果已在数据库中正确定义了外键关系,并且已使用模型设计器创建DataContext(* .dbml),则在检索Bar时应已填充Foos属性。您只需要从Bar类访问Foos属性:

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

此查询将检索与Bar#7关联的Foos集合。