C# 循环引用EF4
我试图将一个Entity Framework 4对象及其子对象返回给jQuery JSON AJAX函数,但我得到了一个循环引用错误——简而言之,我的方法如下所示C# 循环引用EF4,c#,jquery,asp.net,json,entity-framework-4,C#,Jquery,Asp.net,Json,Entity Framework 4,我试图将一个Entity Framework 4对象及其子对象返回给jQuery JSON AJAX函数,但我得到了一个循环引用错误——简而言之,我的方法如下所示 [WebMethod] public static JSONObject Get() { WebHelper.JSONObject lJSONObject = new WebHelper.JSONObject(); lJSONObject.Object = Repository.Parent.Include("Child.
[WebMethod]
public static JSONObject Get()
{
WebHelper.JSONObject lJSONObject = new WebHelper.JSONObject();
lJSONObject.Object = Repository.Parent.Include("Child.Child").FirstOrDefault();
return lJSONObject;
}
如果我不包括子函数,函数可以正常工作,但是对于子函数,循环引用会发生。有什么办法可以解决这个问题吗?我也有同样的问题。我不确定是否还有其他解决方案,但我已将其用于创建自己的序列化方法。尝试将ScriptIgnore属性添加到属性父级。有关更多详细信息,请参阅: --编辑-- 如果在设计器文件中执行此操作,它们将被覆盖。但您可以尝试添加元数据类型:
[MetadataType(typeof(TestMD))]
public partial class Test
{
}
public class TestMD
{
[ScriptIgnore]
public object Parent { get; set; }
}
您必须返回JSONObject吗?如果没有,可以尝试使用,这将正确处理循环引用:
var settings = new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
JsonConvert.SerializeObject(object, Formatting.Indented, settings);
我的猜测是,
JsonObject
只是一个包装器,它将序列化实体并将其放入响应流,这非常简单,可以手动执行。如果我这样做,我想每次构建模型时,我的更改都会被覆盖?即使在EF实体元数据中的所有引用类型上都使用ScriptIgnore,我仍然得到关于动态代理对象的循环引用:(这是一个绝密代码,或者你可以在这里或其他地方提供一个链接吗?我想不是……但是你的序列化方法应该根据你的应用程序工作。所以我的方法对你没有帮助。下面是我所做的(PS:ScriptIgnore对我不起作用):首先,我得到了用于序列化对象的模式(在我的情况下,我需要序列化,不像您那样添加项,但主体是相同的),但通常应该类似于{var1:'val1',var2:'val2'}等等……然后,基于该标准,您可以创建自己的序列化/“de”serialize方法。虽然有点粗糙,但这正是我的工作原理,我非常确定Json的serialize工作原理几乎相同。JSONObject是我自己的自定义类,带有一些属性,因此我可以在客户端确定返回的内容-例如,我有两个属性来处理两种不同类型的错误(异常和我自己的自定义异常类型)-通过这种方式,我可以根据返回的类型执行不同的操作。我可以轻松地返回另一种类型的对象,只要我在客户机上能够看到返回的是object、typeX还是typeY-建议的解决方案是否可以实现这一点?你能用你的JSONObject代码更新你的问题吗?我有点困难根据您的评论了解它的工作原理。不幸的是,我这里没有我的代码,但它是否会像编写以下代码一样简单:object myobject=Repository.Parent.Include(“Child.Child”).FirstOrDefault();string myjson=JsonConvert.SerializedObject(myobject,Formatting.Indented,settings);lJSONObject.Object=myjson;?我的类看起来像这样-非常简单:公共静态类JSONObject{public Object Object{get;set;}公共字符串异常{get;set;}公共MyException MyException{get;set;}}JSON.NET完成了这项工作-我可以将它与我自己的JSONObject一起使用:)问题的根源在于JSON无法处理循环引用