EF 4.1 + MVC + JSON循环引用异常的最佳解决方案?

时间:2011-07-08 09:23:54

标签: .net json asp.net-mvc-3 entity-framework-4.1 circular-reference

我正在使用EF 4.1 Database First方法,T4模板在单独的程序集中生成我的POCO类。我有用于获取数据的存储库,以及用于与UI通信的服务层。

我试图制作级联下拉菜单。 我是MVC和EF 4.1的新手,因此我搜索了stackoverflow以寻找可能的解决方案。

这是示例viewmodel类:

public class MyViewModel
{
public int CustomerId { get; set; }
public string CustomerName { get; set; }
public IEnumerable<Phone> Phones { get; set; }
}

到目前为止我所读到的解决方案是:

  1. 使用ScriptIgnoreAttribute System.Web.Script.Serialization开启 引用属性 - 我没有 真的很想这样做,因为我 不想添加引用 我的POCO项目中的System.Web

  2. 在EF 4.1 DbContext中禁用延迟加载 - 我不确定是否要使用“包含我的项目”

  3. 返回匿名类型 - 当我的项目变大时,我会遇到这种方法的问题吗?

  4. 使用ViewModel - 假设我的客户可以拥有一部或多部手机。在第一个下拉列表中,您可以选择客户,在第二个下拉列表中显示他的所有手机 但是这不会在我的Phones对象上产生循环异常吗?或者我会为我的Phone对象制作一个特殊类?这似乎是很多不必要的代码。

  5. 使用AutoMapper - 没有使用AutoMapper的经验,所以我不知道它有多复杂。

  6. 你会投票给哪一个?为什么?

1 个答案:

答案 0 :(得分:5)

使用视图模型和AutoMapper在您的域模型和您要发送到视图的视图模型之间进行映射。这样,您可以完全控制发送到视图的属性,从而减少服务器和客户端之间发送的数据量。此外,由于您现在使用的是视图模型,因此您的代码对域实体中的修改更具弹性。如果您修改它们,只会影响映射层,因此您无需触摸控制器或视图。

所以我的建议是下载AutoMapper,阅读文档并开始使用它。相信我,这是改变生活的方式。