我有一个WCF服务,它应该返回一个带有任务列表的用户。 这是我的操作代码:
//in the Interface IService
[OperationContract]
User getUser();
//in the Service
public User getNewUser()
{
return new User();
}
在这里我的课程(就像那样简短,它们在不同的文件中):
[Table("user", Schema = "public")]
public class User: ModelBase
{
public string Name{ get; set; }
public virtual ICollection<Task> TaskList { get; set; }
}
[Table("task", Schema = "public")]
public class Task: ModelBase
{
public DateTime Date { get; set; }
public string Description { get; set; }
}
我的问题:当我调用WCF-Method时,使用虚拟ICollection会给我一个错误(在这种情况下,getNewUser,如果有什么内容则无关紧要)。如果ICollection使WCF操作正常工作,则删除“虚拟”,但是我从数据库获取的用户在其列表中没有任务。解决这个问题的正确方法是什么?
答案 0 :(得分:0)
TL; DR回答:问题来自EF。您应该停用延迟加载(通过配置)并改为使用Eager Loading:https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
根据我的结论,当您使用延迟加载时,导航属性永远不会null
。 EF留下标记(留下断点并探索您的值以查看它),因此EF可以按需加载数据(在初始查询之外),WCF无法序列化这些&#34;标记&#34;当它想发送回复时。
防止这种情况的最简单方法是使用急切加载。在将响应发送给客户端之前,您还可以将所有不必要的导航属性设置为null
,但并不是真的建议...