WCF中EF导航属性的最佳实践

时间:2011-07-11 20:39:08

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

根据.NET的当前状态,建议的模式和/或技术是什么?

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

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

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

示例:这是一个公司类,它通过导航属性引用强制类。这是默认的WCF代理技术给我的东西:

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

2 个答案:

答案 0 :(得分:2)

这不是一个好方法。

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

答案 1 :(得分:0)

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