WCF和EntityFramework - 使用虚拟ICollection

时间:2017-08-10 11:41:10

标签: c# entity-framework wcf

我有一个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操作正常工作,则删除“虚拟”,但是我从数据库获取的用户在其列表中没有任务。解决这个问题的正确方法是什么?

1 个答案:

答案 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,但并不是真的建议...