C# WCF和实体框架与Telerik GridModel
这是交叉张贴的 我有一个实体框架(代码优先,4.1)上下文,用于WCF服务层。如果我以这种方式设置服务: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 {
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;
}