假设我有两个表格的数据库 - Groups
和Items
。
Groups
只有两列:Id
和Name
。Items
有三列:Id
,GroupId
和Name
。 如您所见,Groups
和Items
之间存在一对多关系。
我正在尝试使用WCF和LINQ构建Web服务。我添加了新的LINQ to SQL类文件,我已经导入了这两个表。 Visual Studio已经为我自动生成了适当的类。
之后,我为服务创建了简单的客户端,只是为了检查一切是否正常。在我调用GetAllGroups()
方法后,我从Groups
表中获取所有组。但是他们的属性Items
始终为空。
所以我的问题是 - 有没有办法强制WCF返回整个类(整个Group
类和属于它的所有Items
)?或者这是它应该表现的方式?
编辑:这是WCF服务中的函数,它返回所有Groups
:
public List<Group> GetAllGroups()
{
List<Group> groups = (from r in db.Groups select r).ToList();
return groups;
}
我在调试时检查过,Group
函数中的每个GetAllGroups()
对象都有它的项目,但是在客户端收到它们之后 - 每个Items
属性都设置为null
。
答案 0 :(得分:2)
最有可能的是,您遇到了Linq-to-SQL的默认“延迟加载”行为。当您调试并查看.Items
集合时,会导致项目被加载。但是,当您的服务代码正常运行时,这不会发生。
然而,你可以强制执行这些项目的“急切加载” - 尝试这样的事情: (有关详细信息,请参阅Using DataLoadOptions to Control Deferred Loading或LINQ to SQL, Lazy Loading and Prefetching )
public List<Group> GetAllGroups()
{
// this line should really be where you *instantiate* your "db" context!
db.DeferredLoadingEnabled = false;
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Group>(g => g.Items);
db.LoadOptions = dlo;
List<Group> groups = (from r in db.Groups select r).ToList();
return groups;
}
当您致电服务时,现在是否填写了Items
集合?