【问题标题】:WCF Data Service remove entity fieldWCF 数据服务删除实体字段
【发布时间】:2014-02-21 11:54:55
【问题描述】:

我正在使用 WCF 数据服务来提供 OData 端点作为我的服务的一部分。最近我需要向其中一个实体添加一个属性,但我不希望它作为服务的一部分返回。

我先使用代码,我的实体类似于:

[DataServiceEntity]
public class Customer 
{
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int customer_id { get; set; }

    [Required]
    public string customer_name { get; set; }

    public int customer_hidden { get; set; }
}

上面的类是我的 DbContext 的一部分,它被 DataService 使用——所以是一个基本的实现。

是否有任何方法可以防止使用某些 DataAnnotation 将 customer_hidden 返回给客户端?

【问题讨论】:

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


    【解决方案1】:

    我建议您不要在数据层和服务层中使用相同的对象,因为它会在服务器和客户端之间产生紧密耦合。

    这在您的问题中得到了证明,我想:您希望在服务器端有一个标志,表明客户是隐藏的,客户不应该访问的信息。

    相反,您可以在不包含此属性的服务层(在 WCF 服务接口方法中)使用 DTO's,例如

    public class CustomerDto
    {
      public int customer_id { get; set; }
    
      public string customer_name { get; set; }
    }
    

    您需要在实体对象和 DTO 之间进行某种映射,但是有一些不错的第三方库可以为您处理这些问题。我用Automapper

    通过这种方法获得的松散耦合会给您带来一系列优势。例如,考虑您在服务器端扩展或更改客户对象并添加地址数据、电话号码等。或者将 customer_id 重命名为 CustomerId。所有这些更新都可以通过这种方法对客户端隐藏,您只需保留映射(在添加字段的情况下)或稍微更改映射(在重命名字段的情况下)。

    然后,当客户端也已更新以支持新功能时,您可以扩展服务层以包含新属性。

    如果您想完全采用这种方法,您还应该考虑将 DTO 映射回专门用于客户端的客户端 (GUI) 实体。最近,我需要在客户端对象上设置一个标志,以指示该对象是否已被打印。这种标志在服务层或服务器上没有位置,但由于我创建了客户端对象,所以没有问题。

    这种方法的缺点可能是您忘记在服务层中添加的属性在客户端出现null,但根据我的经验,这类错误很容易追踪。

    【讨论】:

    • 感谢您的回复,我会接受您的回答,因为它是正确的 - 但是我有很多直接访问的现有实体,没有太多时间为它们实现 DTO 和映射,所以想知道是否有没有不用 DTO 方法快速隐藏类成员的方法?
    • 那么这个属性应该就是你要找的:msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多