【问题标题】:Best practice for EF navigation properties in WCFWCF 中 EF 导航属性的最佳实践
【发布时间】:2011-07-11 20:39:07
【问题描述】:

根据 .NET 的当前状态,完成以下任务的建议模式和/或技术是什么?

我想通过 WCF 服务传播我的 EF 生成的 SQL 数据库模型。我不想关闭 EF 中的延迟加载,因为我不希望分层结构化实体的级联加载。

在客户端,我不能像处理真正的 EF 对象而不是 WCF 代理一样访问导航属性。我不想发送包括上下文对象在内的 EF 对象,因为在我看来这会破坏 SOA 模式。

事实上,我想更改 Visual Studio 生成的 Reference.cs 文件的实现,以便每次对导航属性的访问都会在需要时引发对服务层的异步回调。

示例:这是一个 Company 类,它通过导航属性引用强制项。这是默认的 WCF-proxy-technique 给我的:

    [System.Runtime.Serialization.DataMemberAttribute()]
    public AddressManager.CompanyService.Mandatory Mandatory {
        get {
            return this.MandatoryField;
        }
        set {
            if ((object.ReferenceEquals(this.MandatoryField, value) != true)) {
                this.MandatoryField = value;
                this.RaisePropertyChanged("Mandatory");
            }
        }
    }

这就是我想要的:

    [System.Runtime.Serialization.DataMemberAttribute()]
    public AddressManager.CompanyService.Mandatory Mandatory {
        get {
            if (this.MandatoryField == null)
            {
                // RAISE SERVICE-METHOD HERE
            }
            return this.MandatoryField;
        }
        set {
            if ((object.ReferenceEquals(this.MandatoryField, value) != true)) {
                this.MandatoryField = value;
                this.RaisePropertyChanged("Mandatory");
            }
        }
    }

【问题讨论】:

  • 考虑为此模式使用 WCF 数据服务。
  • @JeffN825:非常感谢。我想复杂;-)。经过测试,这对我来说是正确的!

标签: .net visual-studio wcf entity-framework


【解决方案1】:

这不是一个好方法。

  • 您在谈论 SOA,同时您将违反以前的 SOA 原则之一 - 边界是明确的。这意味着您不应隐藏对属性 getter 的任何远程调用。显式意味着开发人员必须看到,如果他想要额外的数据,他必须调用代理上的方法,它将创建比本地调用慢 1000 倍的远程调用。属性获取器中没有隐藏的远程调用。您设计的实际上是 WCF 上的延迟加载,这是您应该避免的。
  • 大多数分布式系统的主要目标之一是减少往返,因此为每个导航属性创建往返可能是不好的方法。如果您正在创建需要加载多个相关实体的客户端代码,最好的方法是特殊服务操作,它将在一次往返中返回所有这些实体。仅当加载相关实体稍后发生在与加载初始实体的操作无关的另一个客户端操作期间,多次往返才有意义。
  • 请勿触摸 Reference.cs - 生成的代码和生成的代码不应手动修改,因为一旦您对服务和更新代理进行任何单一更改,您的修改就会丢失。

【讨论】:

  • 谢谢。我是盲目的,因为我认为 OData 不适合我。谈谈你的建议:加载一堆我可能不想使用的空洞数据不是很糟糕吗?在大多数情况下,我们希望避免这种级联行为!
  • 您应该只加载您想要使用的数据,但如果您知道您需要额外的数据,您应该在该调用中包含它们。如果您不知道,您应该提供加载它们的显式方法 - 您将对数据服务执行完全相同的操作。没有隐藏的魔法。
  • 我同意你的看法。问题是,在为我们生成代码方面,有很多很好的新技术可以实现这一点,以至于我只是认为按照 WCF 支持的方式使用它是错误的。在大多数商业项目中,有些人的技能水平很低,或者他们有技能但没有时间使用它们。无论如何:在许多情况下,我需要一种技术来向开发者隐藏这种复杂性。我不喜欢它但需要它(Ashamed_at_moment_of_writing)。谢谢。
【解决方案2】:

Jeff 告诉我使用 OData,它对我有用。谢谢!

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2020-01-09
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多