【问题标题】:Entity object's navigation property set to null after Deserialization反序列化后实体对象的导航属性设置为 null
【发布时间】:2011-11-25 07:09:11
【问题描述】:

我正在开发一个 WPF 应用程序,架构师是

WPF->WCF->DAL

问题是当我调用 WCF 方法时,它返回对象。 WCF 级别的所有内容都可以正常工作,但是在返回对象时,在 WCF 之后,我的导航属性设置为 null。

我返回的是Department 类的object(POCO) 对象,它的导航属性是Employees。我验证了 [DataMember] 属性,但事实并非如此。但是一旦它到达 MainUI,它的 Employees 属性就会设置为 null。

我的导航属性的代码是这样的

谢谢

【问题讨论】:

  • 你能把你的查询代码放上去吗
  • 是WCF服务代码吗?为什么您使用ToFixupCollection 而不是在单个查询中包含所有详细信息? Employees 是映射关系吗?你能显示你的实体的代码吗?您是如何创建 WCF 客户端的?顺便提一句。您可以检查传输的消息以验证 WCF 服务是否发送了您的数据(使用 message logging)?
  • 也不要给department.FirstOrDefault()打电话两次。它执行数据库查询两次。您只需调用一次并使用结果。
  • 嗨 Ladislav,我在我的问题中添加了很多代码,希望对您有所帮助
  • ToFixUpCollection 的代码仍然丢失,但我看到FixupCollection 的设置器没有枚举集合。就像 Ladislav 说的,你应该只使用一次 FirstOrDefault 并枚举 Employees 集合来加载它。

标签: c# wpf entity-framework serialization deserialization


【解决方案1】:

我想这是因为导航属性是延迟加载的。当您尝试访问它们时,它们无法加载,因为上下文已被释放。当您加载主属性时,您应该立即或显式加载它们。

渴望加载:

from d in context.Department.Include("Employees")
select d;

显式加载:

var departments = (from d in context.Department
                   select d).ToList();
departments.ForEach(e => e.EmployeesReference.Load());

问题编辑后编辑

问题可能出在这条线上:

department.FirstOrDefault().Employees = employees.ToFixupCollection();

尝试将其更改为:

department.FirstOrDefault().Employees = employees.ToList<Employee>();

【讨论】:

  • 不,我检查了它并重新检查了它,但没有用,
  • @MSingh 你能发布你的代码吗?这将有很大帮助。注意:如果您在调试模式下检查导航属性,它将显式加载该属性。
  • 感谢您的关注,我在查询中输入了一些代码,请验证。谢谢
  • @MSingh ToFixupCollection 做什么?它是否枚举了查询?
  • ToFixUpCollection 是继承自 Observable Collection 的自定义类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2016-04-22
  • 2015-03-21
相关资源
最近更新 更多