C# 导航属性丢失?

C# 导航属性丢失?,c#,wpf,wcf,entity-framework,mvvm,C#,Wpf,Wcf,Entity Framework,Mvvm,我正在使用WPF/MVVM开发一个应用程序。我有一个WCF数据服务项目,它提供了使用实体框架从ADO.NET数据模型检索数据的操作。然后,我有一个wpf客户端,它绑定到从WCF服务获取的viewmodel属性。该场景涉及客户/办公室。客户端实体具有office类型的导航属性,在数据库中作为外键实现。问题在于,当我的viewmodel从数据服务获取客户机列表时,导航属性为null。但是,服务操作不会检索此信息 WCF服务运营 如果在调用此方法后检查Clients属性,则导航属性现在为空,因此,我放

我正在使用WPF/MVVM开发一个应用程序。我有一个WCF数据服务项目,它提供了使用实体框架从ADO.NET数据模型检索数据的操作。然后,我有一个wpf客户端,它绑定到从WCF服务获取的viewmodel属性。该场景涉及客户/办公室。客户端实体具有office类型的导航属性,在数据库中作为外键实现。问题在于,当我的viewmodel从数据服务获取客户机列表时,导航属性为null。但是,服务操作不会检索此信息

WCF服务运营

如果在调用此方法后检查Clients属性,则导航属性现在为空,因此,我放入的消息框调用会引发null指针异常。看起来,当它通过WCF服务时,它会删除客户端对象的导航属性

请任何人解释一下打电话时如何保留这些信息

多谢各位, 迈克

正如您所看到的,office属性是在上下文查询中加载的。如果我在这里设置一个断点,结果变量将保存客户机信息,导航属性也将按预期填充

我不确定你说的是哪一点,因为那里有多行代码。但是

该问题中提出的解决方案是使用
NoTracking
查询,这样就不必分离:

using (var context = new LDC_Entities())
{
    context.Job.MergeOption = MergeOption.NoTracking;
    return context.Clients.Include("Registered_Office")
        .Where(c => c.Registered_Office_ID == officeID)
        .ToList();
}
这个解决方案可能比那个问题中的解决方案更适合您,因为他们还需要进行更新,这需要对象跟踪,而您只是在进行查询


解决此问题的另一种方法是避免将数据持久性层中的类公开给更高级别的层。然后,您不必担心实体如何序列化,因为您只在直接使用数据持久性层时才使用它们。这还提供了其他优势,如层之间更松散的耦合,以及将更少不必要的数据公开给更高级别的层。使用像这样的库可以帮助减少在层之间复制数据的一些样板。

太棒了,这完全回答了我的问题,现在它可以按预期工作了。感谢您的明确解释和道歉,我不知道“对象图”是什么,因此无法找到其他解决方案。感谢替代技术和重新定义的架构的推荐,将考虑未来。谢谢again@MikeScott:NP,这就是我们在这里的目的:)我认为“导航属性”在谈论EF时更常用,并且对于有相同问题的人来说更容易搜索。至于重做您的体系结构,我建议您做最便宜、最简单的事情,直到您开始频繁碰壁,或者您的体系结构开始出现问题。
private void RefreshClients()
{
    serviceClient.GetClientsByOfficeCompleted += (s, e) =>
    {
            Clients = e.Result;
            foreach (Client c in Clients)
                MessageBox.Show(c.Office.City);
    };

    this.serviceClient.GetClientsByOfficeAsync(CurrentOffice.Office_ID);
}
using (var context = new LDC_Entities())
{
    context.Job.MergeOption = MergeOption.NoTracking;
    return context.Clients.Include("Registered_Office")
        .Where(c => c.Registered_Office_ID == officeID)
        .ToList();
}