2014-03-05 58 views
4

以下類是使用實體框架模型從模板自動生成的。是否需要將POCO類與實體框架一起使用6

namespace Entities 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Country 
    { 
     public Country() 
     { 
      this.Regions = new HashSet<Region>(); 
     } 

     public long CountryId { get; set; } 
     public string Code { get; set; } 
     public string Name { get; set; } 
     public bool Preferred { get; set; } 
     public System.DateTime LastChanged { get; set; } 

     public virtual ICollection<Region> Regions { get; set; } 
    } 
} 

我有一個只返回POX(Xml)和Json的Wcf Web服務。我想要返回自己的序列化對象,如;

public class MyResponseObject 
{ 
    public int RequestId {get;set;} 
    public List<Country> CountryList {get;set;} 
    //other properties 
} 

但我不想返回Regions ICollection。

的對象,然後可以使用類似

Newtonsoft.Json.JsonConvert.SerializeObject()

我是最好的我回自己的序列化的POCO對象以這種方式被退回?

回答

8

在這樣的項目中,你的類可以分成兩種類型:

  1. 數據庫實體對象(是什麼實體框架的工作原理與)
  2. 數據契約對象(什麼WCF或您的Web服務與工作)

雖然可以爲兩者使用相同的對象,但不建議這樣做,因爲數據庫實體對象是與外部接口(您的Web服務)分開的內部實現問題。您可能會向數據庫表中添加或刪除列,並且不希望API合約發生更改。但通常你會想要隱藏服務消費者的信息,比如數據庫表Users (UserId, Password),你絕對不希望Password屬性出去!

另一個原因不是您稍後可能想要爲Web服務合約類添加屬性(例如控制輸出格式設置或輸入驗證),將這些屬性添加到實體對象中是非常痛苦的,如果在某些情況下不是不可能的話。

我知道這聽起來像是一種不必要的工作重疊,因爲大多數班級都會有相同的成員,但從長遠的角度來看,這是有意義的。

幸運的是,像AutoMapper這樣的工具可以加速將數據從數據庫實體對象複製到數據合同對象的過程。

+0

所以基本上我會創建一個POCO類,我用來自實體對象的數據填充。爲了填充POCO類對象,我最好只是遍歷實體對象,爲每次迭代填充POCO類?你可以給我一個例子請 – Tommassiov

+0

@ Tommo1977有工具可以自動執行該過程,[AutoMapper](https://github.com/AutoMapper/AutoMapper)是一個受歡迎的工具。 –

+0

@ Tommo1977您的web服務數據傳輸類不一定是POCO,如果它們涉及任何自定義繼承,接口或屬性。 Jus'說。 – Dai