我正在使用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中的某些内容),请帮助我。
答案 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