【问题标题】:WCF and Entity Framework with Telerik GridModel带有 Telerik GridModel 的 WCF 和实体框架
【发布时间】:2011-10-29 03:50:23
【问题描述】:

这是在Telerik's support forums 上交叉发布的。

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

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;
}

服务运行良好。如果我像这样设置它,遵循the examples for grid binding via web services...

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
                      };

    return planMembers.ToGridModel(state);
}

它总是得到异常:

底层连接已关闭:连接已关闭 没想到。

我确定这是一个序列化问题。无论出于何种原因,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;
}

【问题讨论】:

    标签: c# wcf telerik


    【解决方案1】:

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

    【讨论】:

    • 这部分正确。不过,它确实让我朝着正确的方向前进。最后我不能直接使用 EFCF 实体,因为我是延迟加载的。真正的对象类型是动态代理,WCF 无法序列化。我需要使用数据传输对象。
    • 如果您关闭代理创建和延迟加载,您可以不使用 DTO。您还需要确保将[DataContract] 属性添加到您的实体并指定IsReference = true。否则,您可能会遇到对象图中的循环问题。如果您包含关联,这可能仍然是 DTO 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多