C# WCF和实体框架与Telerik GridModel

C# WCF和实体框架与Telerik GridModel,c#,wcf,telerik,C#,Wcf,Telerik,这是交叉张贴的 我有一个实体框架(代码优先,4.1)上下文,用于WCF服务层。如果我以这种方式设置服务: public IEnumerable<Dto.PlanMember> GetPlanMembers() { var planMembers = from member in this.DataSource.PlanMemberDbSet.Take(10) select new Dto.PlanMember {

这是交叉张贴的

我有一个实体框架(代码优先,4.1)上下文,用于WCF服务层。如果我以这种方式设置服务:

public IEnumerable<Dto.PlanMember> GetPlanMembers() {
    var planMembers = from member in this.DataSource.PlanMemberDbSet.Take(10)
                      select new Dto.PlanMember {
                          Id = member.Id,
                          FirstName = member.FirstName,
                          LastName = member.LastName
                      };

    return planMembers;
}
它始终得到例外:

基础连接已关闭:连接已关闭 想不到

我确信这是一个序列化问题。无论出于何种原因,
ToGridModel
扩展方法在EFCF 4.1中无法正常工作。如何解决这个问题

这也不起作用,因此它必须与序列化
GridModel
类型相关,而不是扩展方法本身,这是问题所在:

public GridModel GetPlanMembers(GridState state) {
    var planMembers = from member in this.DataSource.PlanMemberDbSet.Take(10)
                      select new Dto.PlanMember {
                          Id = member.Id,
                          FirstName = member.FirstName,
                          LastName = member.LastName
                      };

    var gridModel = new GridModel {
        Data = planMembers,
        Total = planMembers.Count()
    };

    return gridModel;
}

问题是LINQ查询延迟了执行。所以您返回的是IQueryable。在WCF尝试序列化数据之前,不会实际检索数据。问题是,此时您的连接已经关闭。在那里抛出一个
.ToList()
,你应该会很好。

这部分是正确的。不过,这确实让我找到了正确的方向。最后,我不能直接使用EFCF实体,因为我是惰性加载。真正的对象类型是动态代理,WCF无法序列化它。我需要使用数据传输对象。如果你关闭代理创建和延迟加载,你可以不使用DTO。您还需要确保向实体添加
[DataContract]
属性,并指定
IsReference=true
。否则,您可能会遇到对象图中周期的问题。如果包含关联,这可能仍然是DTO的问题。
public GridModel GetPlanMembers(GridState state) {
    var planMembers = from member in this.DataSource.PlanMemberDbSet.Take(10)
                      select new Dto.PlanMember {
                          Id = member.Id,
                          FirstName = member.FirstName,
                          LastName = member.LastName
                      };

    var gridModel = new GridModel {
        Data = planMembers,
        Total = planMembers.Count()
    };

    return gridModel;
}