2014-02-21 38 views
0

我正在使用WCF數據服務提供OData端點作爲我的服務的一部分。最近我有一個要求將財產添加到其中一個實體,但我不希望這返回作爲服務的一部分。WCF數據服務刪除實體字段

我第一次使用的代碼,我的實體類同:

[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的一部分 - 所以基本實現。

有沒有辦法阻止customer_hidden使用某些DataAnnotation返回給客戶端?

回答

0

我建議您不要在數據層和服務層使用相同的對象,因爲它會在服務器和客戶端之間創建一個緊密的耦合。

這在您的問題中得到證明,我想:您希望服務器端的標誌表示客戶是隱藏的,客戶端不應該訪問的信息。

相反,您可以在服務層(在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但在我的經驗中,這些類型的錯誤相當容易追蹤。

+0

感謝您的回覆,我會接受您的答案,因爲它是正確的 - 但是我有很多現有實體直接訪問,沒有很多時間來實現DTO和映射,所以想知道是否有辦法快速隱藏沒有DTO方法的班級成員? – eoghank

+0

然後這個屬性應該是你要找的:http://msdn.microsoft.com/en-us/library/system.data.services.ignorepropertiesattribute.aspx –