我有asp.net mvc应用程序,我的模型有一个关系,如“问题可以有多个答案”。因此,在创建其.dbml文件和类时,问题类会包含EntitySet吗?但是EntitySet中的每个对象(表示Answer对象)都将Property作为“Question”,因此框架会自动创建循环引用和依赖项。当我们要序列化问题列表(List)以生成json输出时,它确实成为焦点,用于控制器中的特定操作。如果我们在designer.cs文件中的“Question”类中使用[ScriptIgnore]属性作为“Answers”(由框架生成,通常人们可以避免打扰它和我),那么一切运行正常。
我们可以通过使用部分类来解决这个问题吗?但我认为c#中不存在部分属性。
我的问题是,这是BUG吗?还是解决它的一些补救措施?我的关系是:
错误是:
A circular reference was detected while serializing an object of type 'myApp.Models.Question'.
答案 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]的解决方案可能是解决问题的最佳方法。可能最好把它放在答案的“问题”中。