【问题标题】:WCF and EntityFramework - using virtual ICollectionWCF 和 EntityFramework - 使用虚拟 ICollection
【发布时间】:2017-08-10 11:41:09
【问题描述】:

我有一个 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 方法时,使用虚拟 ICollection 会出现错误(在这种情况下是 getNewUser,其中是否有内容无关紧要)。如果 ICollection 使 WCF 操作正常工作,则删除“虚拟”,但是我从数据库中获取的用户列表中没有任务。解决这个问题的正确方法是什么?

【问题讨论】:

  • "给我一个错误" 错误是...?
  • 它没有错误代码,它在收到消息时说错误,连接被主机关闭。经过大量谷歌后,我发现问题是由 -virtual- 引起的,但这是实体框架所需要的。
  • 不,virtual 是 EF不需要的。所谓的延迟加载需要它。您可以随时将其删除并使用预先加载 (Include)。
  • 我是 EF 新手 :( 有没有一个简单的例子?
  • 我明白了。这是 IMO 一个很好的帖子,可以提供一些启示:) - Loading Related Entities with Entity Framework - A Beginner's Primer

标签: c# entity-framework wcf


【解决方案1】:

TL; DR 回答:问题仅来自 EF。您应该停用延迟加载(通过配置)并改用急切加载:https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

根据我的结论,当您使用延迟加载时,导航属性永远不会是null。 EF 留下标记(留下断点并探索您的值以查看它),因此 EF 可以按需加载数据(在初始查询之外),而 WCF 在想要发送响应时无法序列化这些“标记”。

防止这种情况的最简单方法是使用急切加载。您也可以在将响应发送给客户端之前将所有不必要的导航属性设置为 null,但实际上不建议这样做...

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多