WCF数据服务删除实体字段

WCF数据服务删除实体字段,wcf,entity-framework,odata,wcf-data-services,Wcf,Entity Framework,Odata,Wcf Data Services,我使用WCF数据服务提供OData端点作为我服务的一部分。最近,我有一个要求向其中一个实体添加属性,但我不希望将其作为服务的一部分返回 我首先使用代码,我的实体类似于: [DataServiceEntity] public class Customer { [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int customer_id { get; set; } [

我使用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; }
}
上面的类是DataService使用的DbContext的一部分,因此是一个基本实现


是否有任何方法可以防止隐藏的客户_使用某些数据注释返回给客户机

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

我想这就是你的问题:你希望服务器端有一个标志,表明客户是隐藏的,客户不应该访问这些信息

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

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

  public string customer_name { get; set; }
}
您可能需要在实体对象和DTO之间进行某种映射,但是有很好的第三方库可以为您处理这种映射。我用

通过这种方法获得的松散耦合为您提供了一系列优势。例如,您可以在服务器端扩展或更改客户对象,并添加地址数据、电话号码等,或者重命名<强> Customer ID ID/强>到<强> Customer ID<强>。通过这种方法,可以对客户端隐藏所有这些更新,您只需保留映射(在添加字段的情况下)或稍微更改映射(在重命名字段的情况下)

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

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


这种方法的一个缺点可能是您忘记在服务层中添加的属性在客户端显示为null,但根据我的经验,这些bug很容易找到。

谢谢您的回复,我会接受你的回答,因为它是正确的-但是我有很多直接访问的现有实体,没有太多的时间为它们实现DTO和映射,所以我想知道是否有一种方法可以快速隐藏类成员而不使用DTO方法?那么这个属性应该是你正在寻找的: