这个错误是什么?......有循环引用的理由......如何解决,但?

问题描述:

我有asp.net mvc应用程序,其中我的模型具有类似“问题可以有多个答案”的关系。所以,当创建它的.dbml文件和类的问题类将包含EntitySet的权利?但EntitySet中的每个对象(意味着Answer对象)都将Property作为“Question”,因此框架会自动创建循环引用和依赖关系。当我们要序列化问题列表(列表)来生成json输出时,这对于控制器中的特定操作来说非常重要。如果我们在designer.cs文件的“Question”类中使用[ScriptIgnore]属性作为“Answers”属性(由框架生成,通常人们避免打扰它并且我也是),那么一切运行良好。这个错误是什么?......有循环引用的理由......如何解决,但?

我们可以通过使用部分类来解决这个问题吗?但我认为部分属性不存在于C#中。

我的问题是,这个BUG是?或一些补救措施来解决它?我的关系是:enter image description here

和错误是:

A circular reference was detected while serializing an object of type 'myApp.Models.Question'. 
+0

我期待这里的描述来清除我的概念。 – 2011-02-04 05:25:43

这是您正在使用不正确的功能。

您不应该序列化LINQ to SQL(或实体框架)类。即使Microsoft已经在这些类上放置了[DataContract]和其他属性,它们也不应该被序列化。

相反,设计一组正确匹配你想要序列化的类。比如:这些类从数据库类的

public class Question 
{ 
    public int ID {get;set;} 
    public string Text {get;set;} 
    public List<Answer> Answers {get;set;} 
} 

public class Answer 
{ 
    public string Text {get;set;} 
} 

填充的情况下,和序列化这些数据传送类来代替。

顺便说一句,这是数据传输对象模式。

它是一个功能:)

问题的根源在于,JSON不支持循环引用(虽然实体框架一样)。

因此,当您使用JSON将数据传输到客户端时,您需要决定要使用的层次结构。

您对[ScriptIgnore]的解决方案可能是解决问题的最佳方法。可能最好将它放在答案中的“问题”上。

+0

我和我...虽然是功能,我很高兴。但json不支持它是任何开发人员都无法接受的。但是我想在客户端使用这些问题的答案。所以它必须是序列化的,并且应该以序列化的形式得到答案列表。我知道[ScriptIgnore]是最好解决它,但它是避免序列化DESINGER.CS文件中的答案列表。我不会承担或强迫改变,因为它是框架创建的。 – 2011-02-04 05:17:06

用[DataContract(IsReference = true)]标记您的类以允许循环引用的序列化