.net Linq到SQL集合不填充

.net Linq到SQL集合不填充,.net,sql,linq,linq-to-sql,.net,Sql,Linq,Linq To Sql,我有一个Linq到SQL类 我的数据库中存在一对多关系 关系在设计器中正确映射,并且在设计器中创建一个EntitySet属性 当我运行代码时,EntitySet不会填充任何数据,即使存在关联的记录,它们也不会填充到EntitySet 我是否缺少一些属性或设置?我必须自己写查询吗?我觉得我错过了一些明显的东西 以下是设计器代码: [Association(Name = "Bar_Foo", Storage = "_Foo", ThisKey = "ID", OtherKey = "BarID")]

我有一个Linq到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);
    }
}
有关我的情况的更多信息:

                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;
            }
因此,从上面看,我有一个带有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);
        }
    }
}
公共类服务:ITEService
{
公共列表getbar()
{
尝试
{
使用(var db=new BarDataContext())
{
列表栏=新列表();
条=(从B到db.条)
选择B).ToList();
返回杆;
}
}
捕获(例外情况除外)
{
抛出新的FaultException(例如GetBars()堆栈跟踪中的Message+“Something:”+ex.StackTrace);
}
}
}
当前,当服务返回条时,每个条中的Foos都为null


若我在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;
            }
使用(var ctx=new BarDataContext())
{
列表栏=新列表();
条=(从ctx中的B开始。条
选择B).ToList();
foreach(条中的条)
{
bar.Foos=(从ctx.bar中的B开始)
其中B.ID==bar.ID
选择B.Foos).SingleOrDefault();
}
返回杆;
}
当我试图从Bar查询Foos时,这段代码会生成一个空引用异常

编辑:

                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,您可以将Foos查询放入一个从未使用过的变量中,它将填充bar.Foos属性,就因为您查看了Foos。让我想起了薛定谔的猫。

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关联的Foo集合。

您可以发布您正在使用的代码吗,在这种情况下,这会有很大帮助。请发布一些代码,以便我们更好地理解问题。我在上面添加了更详细的解释。每当我尝试查询a.Foos时,我都会收到一个空引用异常,尽管我已经通过设计器创建了表关联,如上面的代码块所示。在将其传递到UI层之前,我需要在WCF服务中填充Foos属性。我将使用上面的空引用代码。