不允许循环引用--Json序列化

时间:2011-08-13 12:27:17

标签: json asp.net-mvc-3 entity-framework-4.1 ef-code-first

我正在使用Entity Framework代码4.1和MVC3开发应用程序。这里有三个实体,基本上是State => City =>局部性。

public class State {
    public virtual List<City> Cities { get; set; }
}

public class City {
    public virtual List<Locality> Localities { get; set; }
    public virtual State State { get; set; }
}

public class Locality {
    public virtual City City { get; set; }
}

可以看出,我正在为所有三个实体使用双向关系。 Json不允许这样做,所以我有点沮丧。基本上,我需要向两个方向导航。例如,给定一个城市,我希望能够轻松找到它所属的国家。

我扫描了网页并遇到了几个解决方法,但它们都不适合我的方案。第一个是使关系单向(谁会这样做!)而我不希望这样。其他的是只引入ViewModel我需要的属性,但如果我需要定期使用Entity的所有字段,那就意味着重复的代码。我的控制器也将充斥着这些属性。所以我也不喜欢这样。

我当时认为这只是基本的东西,但现在我正在努力找到一个可行的解决方案。如果有人有更好的选择(也许是MVC3中的某些内容),请帮助我。

3 个答案:

答案 0 :(得分:0)

我不是ASP专家,但我认为解决方案可能类似于我在Java,Groovy或python或任何其他语言中所做的事情。

我可以提出的最佳解决方案是使City.Localities成为一种“瞬态”(在Java术语中)字段 - 即不要序列化它,而是在加载时(构建结构时)更新它。这可以封装在City of the Locality类的setter中。 所以在Locality.setCity中,在set方法中你应该调用(city-&gt; localities.append(this)(无论你编写什么语言)。这样它就会成为City-&gt; Localities的“运行时缓存”。将在装载期间建造一次。

答案 1 :(得分:0)

您可以尝试直接使用JavaScriptSerializer并注册自己的converter来控制序列化过程。

答案 2 :(得分:0)

问题似乎是DataContractJsonSerializer对实体类型的支持的本机问题。简而言之,与其他实体类型具有关系(即双向)的实体无法通过Json序列化。在您的示例中:连接到Cities表的State表将无法很好地转换为Json序列化,因为State可能有许多城市,而City与某个State相关联。

一个快速解决方案是匿名对象投影。 像这样的例子:

public JsonResult Orders()
    var results = from Ord in databaseContext.Orders
          select new
          {
              OrderID = Ord.ID,
              OrderTitle = Ord.Name,
              OrderDate = Ord.OrderDate
          }

    return Json(results);
}

供参考,请参阅:Serializing Entity Framework Objects into JSON Using ASP.Net MVC