LINQ to SQL:Child属性为null,即使它已被返回

时间:2009-07-27 15:59:35

标签: c# linq-to-sql

场景Customer实体具有StateColor的属性。即华盛顿和绿色。 SQL Server外键关系设置正常,并且都具有正确的参考完整性的正确数据。

考虑这个LINQ to SQL查询:

var cust = (from c in db.Customers
  join s in db.States on c.StateID equals s.ID
  join cl in db.Color on c.ColorID equals cl.ID
  where c.ID == someCustomerID
  select c).SingleOrDefault();

给定:通过SQL Server Profiler查看时生成的SQL语句会生成正确的查询。在SQL Management Studio中捕获并运行相同的查询会按预期返回数据。

cust.StateIDcust.State属性填充正常。我可以在执行上述L2S查询后立即检查这些属性。

问题cust.Color对象,评估为null。好消息是cust.ColorID填充了DB中正确的FK编号。 Color表中有一行带有该ID。

问题:如何更改或改进此查询以包含Color实体?

编辑:结束本问题

问题的根源在于LINQ To SQL设计器以及之前对FK关系的搞砸。 Customer和Color之间的关联与客户的另一个字段有关。这是总的PEBKAC,我没有检查过L2S设计师是否有任何问题。我从L2S设计器中删除了Color表,刷新了Server Explorer中的表列表,然后再将Color表拖到L2S上。该协会已得到纠正。

3 个答案:

答案 0 :(得分:1)

您是否有与您的数据上下文关联的LoadOptions对象?尝试添加以下内容:

var lo = new LoadOptions(x => x.Color);
lo.LoadWith<Color>();
using (var db = new SomeDataContext())
{
  db.LoadOptions = lo;
. . . 
}

答案 1 :(得分:1)

就我而言,DataContext上的ObjectTrackingEnabled = false为{{3}},所以我已经改变了:

using (var db = new ERPDataContext() { ObjectTrackingEnabled = false })
{
    // ..
}

to(我也可以简单地省略它,因为ObjectTrackingEnabled = true是默认值):

using (var db = new ERPDataContext() { ObjectTrackingEnabled = true})
{
    // ..
}

答案 2 :(得分:0)

问题的根源在于LINQ To SQL设计器以及之前对FK关系的搞砸。 Customer和Color之间的关联与客户的另一个字段有关。这是总的PEBKAC,我没有检查过L2S设计师是否有任何问题。我从L2S设计器中删除了Color表,刷新了Server Explorer中的表列表,然后再将Color表拖到L2S上。该协会已得到纠正。