.net Linq到SQL集合不填充
我有一个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")]
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属性。我将使用上面的空引用代码。