这个错误吗?...有理由在循环引用背后......如何解决但是?

时间:2011-02-03 14:05:26

标签: entity-framework asp.net-mvc-2 list serialization

我有asp.net mvc应用程序,我的模型有一个关系,如“问题可以有多个答案”。因此,在创建其.dbml文件和类时,问题类会包含EntitySet吗?但是EntitySet中的每个对象(表示Answer对象)都将Property作为“Question”,因此框架会自动创建循环引用和依赖项。当我们要序列化问题列表(List)以生成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'.

3 个答案:

答案 0 :(得分:2)

这是您使用不当的功能。

您永远不应该序列化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;}
}

从数据库类中填充这些类的实例,并改为序列化这些数据传输类。

BTW,这是数据传输对象模式。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这是一个特色:)

问题的根源是JSON不支持循环引用(尽管实体框架确实如此)。

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

使用[ScriptIgnore]的解决方案可能是解决问题的最佳方法。可能最好把它放在答案的“问题”中。