【问题标题】:Can I 'Expand' additional data on already tracked entity?我可以“扩展”已跟踪实体的附加数据吗?
【发布时间】:2011-10-26 19:21:18
【问题描述】:

我正在使用 WCF Dataservice / EF 4.1 和 WPF 客户端应用程序。 这是我的问题以更简单的形式。假设我查询客户:

var query = (from o in ServiceRef.Clients.Expand("Addresses,PhoneNumbers,EmailAddresses")
                       where o.FirstName.ToLower().Contains(sf) ||
                             o.LastName.ToLower().Contains(sf) || ...
                         orderby o.LastName
                         select o).Take(100);

这就是我识别客户所需的全部内容。但是,我希望在第一次查询中看到评论、购买历史或其他未“扩展”的相关实体。如果我再次查询,使用相同的 ServiceRef 上下文,我将永远无法扩展“评论”。

我猜这与上下文有关,发现“客户端”实体已被跟踪,因此未针对服务执行新查询。

现在有些帖子说,永远不应该将 DBContext 保留那么长时间,我完全不同意这一点。这是一个简单的 Master/Details 场景。为每个“详细信息查询”创建一个新的上下文来获取额外的数据似乎是错误的。有没有办法强制 EF “重新加载”实体以获取额外数据?

当然,我可以在初始查询中扩展我曾经需要的每个附加实体。但随后我为每个搜索结果提供了大量数据。其中 95% 永远不会被使用。

要清楚。我要问的是更多“最佳实践”问题。中间有办法吗?在一直在扩展(...)所有数据之间 一直在创建新的上下文。?如果需要,有没有办法加载额外的数据。

谢谢,安德烈亚斯

【问题讨论】:

    标签: wpf entity-framework wcf-data-services odata


    【解决方案1】:

    您的问题有两个部分。

    如何获取额外数据?

    • 您可以在初始查询中使用 ServiceRef.Clients.Expand("Comments"),但这显然不是您想要的 - 这称为预加载
    • 或者您可以使用 ServiceRef.LoadProperty(client, "Comments") 为单个客户端填充 cmets - 这可以称为显式加载

    上下文应该存在多长时间?

    这取决于。正确的方法确实是让上下文尽可能短,但这并不意味着在每次操作后关闭上下文。上下文应该作为工作单元,所有相关的操作都应该在同一个上下文实例上进行。在 WPF / WinForm 应用程序的情况下,这意味着上下文确实可以存在更长的时间 - 它通常与某些表单 / 演示者 / 等配对。您不应该在多个不相关且不相关的表单中使用相同的上下文形成单个工作单元/逻辑操作(同一工作单元中的对象一起操作和保存)。

    【讨论】:

    • 感谢 Ladislav 将我指向 LoadProperty()。直到现在我才明白它是为了什么。在上下文生存期部分,我不得不说我发现自己经常缩小工作单元的“范围”,主要是在我实现 save() 之后。谢谢
    • 只是想知道,通过 EF 所做的所有跟踪,内置这种行为会不会很好/可能。...如果已经跟踪,但不是所有属性 -> 加载缺少属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2014-10-02
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多