【问题标题】:Navigation Property Being Lost?导航属性丢失?
【发布时间】:2011-12-06 10:57:28
【问题描述】:

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

WCF 服务操作

[OperationContract]
public IEnumerable<Client> GetClientsByOffice(int officeID)
{
    using (var context = new LDC_Entities())
    {
        var result = context.Clients.Include("Registered_Office")
            .Where(c => c.Registered_Office_ID == officeID).ToList();

        result.ForEach(c => context.Detach(c));
        return result;
    }
}

如您所见,办公室属性已在上下文查询中加载。如果我在这点下一个断点,结果变量保存了客户端信息,并且导航属性也按预期填充。

WPF 视图模型

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);
}

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

请任何人解释在拨打此电话时如何保留这些信息?

提前非常感谢, 迈克

【问题讨论】:

    标签: c# wpf wcf entity-framework mvvm


    【解决方案1】:

    如您所见,办公室属性已在上下文查询中加载。如果我在这点下一个断点,结果变量保存了客户端信息,并且导航属性也按预期填充。

    我不确定您在说哪一点,因为那里有多行代码。但是the object graph gets shredded when you detach entities。

    该问题中提出的解决方案是使用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();
    }
    

    这个解决方案可能比在那个问题中更适合你,因为他们还需要进行更新,这需要对象跟踪,而你只是在做一个查询。

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

    【讨论】:

    • 太棒了,这完全回答了我的问题,它现在按预期工作。感谢您的明确解释和道歉,我不知道“对象图”是什么,因此找不到其他解决方案。感谢您推荐替代技术和重新定义的架构,将来会考虑这一点。再次感谢
    • @MikeScott: NP,这就是我们在这里的目的:) 我认为“导航属性”在谈论 EF 时更常用,对于有同样问题的人来说更容易搜索.至于重做你的架构,我建议你做最便宜和最简单的事情,直到你开始经常碰壁,或者你的架构开始看起来有疣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多