1

假设我有两个表的数据库 -GroupsItems.

  • Groups只有两列:IdName
  • Items有三列IdGroupIdName

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.

4

1 回答 1

2

最有可能的是,您遇到了 Linq-to-SQL 的默认“延迟加载”行为。当您调试并查看.Items集合时 - 这会导致项目被加载。但是,当您的服务代码正常运行时,这不会发生。

但是,您可以强制“急切加载”这些项目 - 尝试如下操作:(有关更多详细信息,请参阅使用 DataLoadOptions 控制延迟加载LINQ to SQL、延迟加载和预取

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集合?

于 2012-08-11T15:31:03.270 回答