以下类是使用实体框架模型从模板自动生成的。
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; }
}
}
我有一个Wcf Web服务,只返回POX(Xml)和Json。我想要返回我自己的序列化对象,如;
public class MyResponseObject
{
public int RequestId {get;set;}
public List<Country> CountryList {get;set;}
//other properties
}
但我不想返回Regions ICollection。
然后可以使用
之类的东西返回对象Newtonsoft.Json.JsonConvert.SerializeObject()
我最好以这种方式返回我自己的序列化POCO对象吗?
答案 0 :(得分:8)
在这些项目中,您的类可以分为两种类型:
虽然可以为两者使用相同的对象,但不建议这样做,因为数据库实体对象是与外部接口(您的Web服务)分开的内部实现关注点。您可以在数据库表中添加或删除列,而不希望更改API合约。但通常你会想要隐藏服务消费者的信息,比如数据库表Users ( UserId, Password )
,你绝对不希望Password
财产出去!
另一个原因是你以后可能想要为你的webservice合同类添加属性(例如控制输出格式或输入验证),将这些添加到实体对象是痛苦的,如果不是在某些情况下不可能。
我知道这听起来像是不必要的重复工作,因为大多数课程都有相同的成员,但从长远的角度来看,这是有道理的。
幸运的是,像AutoMapper这样的工具可以加速将数据从数据库实体对象复制到数据协定对象的过程。