我在EF Code First上下文中使用了一些POCO对象。所以,当我用数据填充它们时,实际上我正在处理EF代理对象而不是POCO本身。将EF代理对象转换为原始POCO对象的最佳方式是什么?
我有一个ASP.NET MVC4 ApiController返回我的POCO对象,我将在我的客户端应用程序消耗。
我的“GET”方法看起来是这样的:
// GET api/Clients/5
public Client GetClient(int id)
{
Client client = db.Clients.Find(id);
if (client == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return client;
}
这并不实际工作,因为当串行尝试序列Client对象,它实际上是在处理与EF代理的版本,这将导致它打嗝。见Can an ApiController return an object with a collection of other objects?
所以,我可以这样做是为了我的DbContext
关闭代理代:
db.Configuration.ProxyCreationEnabled = false;
这保证了我处理与POCO,而不是代理。但是,现在我的Client类中的大多数成员都没有填充,因为它是EF代理懒惰加载这些给我的。
所以我真正想要的是使用EF代理类来获取数据,然后在最后一分钟从我的方法返回原来的POCO。
我怎么能做到这一点,而无需手动从头创建整个对象(包括任何嵌套对象)的代码?当然,必须有一个简单的方法 - 或者至少是某种助手类?
+1暴露DTO的远程客户端是最好的一段路要走。它使您可以完全控制通过线路发送的数据。 – 2012-08-01 15:53:57
谢谢,我会检查AutoMapper - 这听起来就像我正在寻找的“某种助手类”。 – 2012-08-01 22:13:46