Entity framework 这是错误吗?…循环引用背后有原因。。。但是怎么解决呢?

Entity framework 这是错误吗?…循环引用背后有原因。。。但是怎么解决呢?,entity-framework,asp.net-mvc-2,list,serialization,Entity Framework,Asp.net Mvc 2,List,Serialization,我有一个asp.NETMVC应用程序,其中我的模型有一个类似“问题可以有多个答案”的关系。因此,在创建.dbml文件和类时,问题类将包含EntitySet,对吗?但EntitySet中的每个对象(意味着Answer对象)都将具有“Question”属性,所以框架会自动创建循环引用和依赖项。当我们要序列化问题列表(List)以生成json输出时,它会成为我们关注的焦点,用于控制器中的特定操作。如果我们在designer.cs文件的“Question”类中使用[ScriptIgnore]属性作为“A

我有一个asp.NETMVC应用程序,其中我的模型有一个类似“问题可以有多个答案”的关系。因此,在创建.dbml文件和类时,问题类将包含EntitySet,对吗?但EntitySet中的每个对象(意味着Answer对象)都将具有“Question”属性,所以框架会自动创建循环引用和依赖项。当我们要序列化问题列表(List)以生成json输出时,它会成为我们关注的焦点,用于控制器中的特定操作。如果我们在designer.cs文件的“Question”类中使用[ScriptIgnore]属性作为“Answers”(由framework生成,通常人们避免干扰它和我),那么一切都会正常运行

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

我的问题是,这是错误吗?还是解决问题的办法?我的关系是:

错误是:

A circular reference was detected while serializing an object of type 'myApp.Models.Question'.
这是一个特性:)

问题的根源在于JSON不支持循环引用(尽管实体框架支持循环引用)

因此,当您使用JSON将数据传输到客户端时,您需要决定要使用的继承权

您使用[ScriptIgnore]的解决方案可能是解决此问题的最佳方法。也许最好把它放在回答的“问题”上。

这是一项功能:)

问题的根源在于JSON不支持循环引用(尽管实体框架支持循环引用)

因此,当您使用JSON将数据传输到客户端时,您需要决定要使用的继承权


您使用[ScriptIgnore]的解决方案可能是解决此问题的最佳方法。可能最好将其放在回答中的“问题”上。

这是一个您未正确使用的功能

永远不要将LINQ序列化为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;}
}
公开课问题
{
公共int ID{get;set;}
公共字符串文本{get;set;}
公共列表答案{get;set;}
}
公开课答案
{
公共字符串文本{get;set;}
}
从数据库类中填充这些类的实例,并序列化这些数据传输类


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

这是您使用不正确的功能

永远不要将LINQ序列化为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;}
}
公开课问题
{
公共int ID{get;set;}
公共字符串文本{get;set;}
公共列表答案{get;set;}
}
公开课答案
{
公共字符串文本{get;set;}
}
从数据库类中填充这些类的实例,并序列化这些数据传输类


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

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

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

。。。虽然这是一个特色,但我对它很满意。但是json不支持它,这是任何开发人员都无法接受的。但在这里,我想在客户端使用这些问题的答案。所以它必须是序列化的,并且应该以序列化的形式出现在答案列表中。我知道[ScriptIgnore]是最好的解决方法,但它避免了在DESINGER.CS文件中序列化答案列表。我不会承担或强迫改变,因为它是框架创建的。。。虽然这是一个特色,但我对它很满意。但是json不支持它,这是任何开发人员都无法接受的。但在这里,我想在客户端使用这些问题的答案。所以它必须是序列化的,并且应该以序列化的形式出现在答案列表中。我知道[ScriptIgnore]是最好的解决方法,但它避免了在DESINGER.CS文件中序列化答案列表。我不会承担或强迫改变,因为它是框架创建的。我在这里期待描述,以澄清我的概念。我在这里期待描述,以澄清我的概念。