我有一个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。让我想起了薛定谔的猫。
答案 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集合。