2014-03-05 45 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