C# 将实体血清化;禁用代理创建和延迟加载?

C# 将实体血清化;禁用代理创建和延迟加载?,c#,asp.net,entity-framework,lazy-loading,C#,Asp.net,Entity Framework,Lazy Loading,在将EF实体转换为json对象时,我在循环引用方面遇到了一些问题。我已经找到了一个适合我的解决方案,但我想知道当我添加时实际发生了什么 context.ContextOptions.ProxyCreationEnabled = false; 和/或 context.ContextOptions.LazyLoadingEnabled = false; 第一个似乎足以获得一个一维json对象。我应该两者都用吗?他们到底在做什么?有没有更聪明的办法?谢谢第一行关闭从实体类继承的类的运行时生成。这

在将EF实体转换为json对象时,我在循环引用方面遇到了一些问题。我已经找到了一个适合我的解决方案,但我想知道当我添加时实际发生了什么

 context.ContextOptions.ProxyCreationEnabled = false;
和/或

context.ContextOptions.LazyLoadingEnabled = false;

第一个似乎足以获得一个一维json对象。我应该两者都用吗?他们到底在做什么?有没有更聪明的办法?谢谢

第一行关闭从实体类继承的类的运行时生成。这个类实际上是在运行时使用的。不是你们班。这个运行时生成的类可能不可序列化,这就是为什么这一行(关闭代理生成)使序列化工作

第二行关闭延迟加载。假设有父实体和子实体。当您请求家长时,如果启用了延迟加载,则不会加载孩子。当它关闭时,无论何时加载父对象,都会加载它的所有子对象。我认为如果你正在使用EF,你应该熟悉这一点

编辑:
如果循环引用有问题,那么应该关闭延迟加载。然后,当您序列化父对象时,您将不会尝试序列化引用到父对象的子对象(创建循环引用)

我从您上一篇文章中注意到,您正在使用JavaScriptSerializer。这有什么具体原因吗?这是用于web应用程序的吗?我认为您应该采用不同的方法获取json,例如DataContractJsonSerializer或json.NET库。@SeanThoman我尝试过使用json.NET,但仍然得到循环引用异常。这是一个普通的asp.net 4.0 web窗体应用程序。你有使用DataContractJsonSerializer的例子吗?禁用代理创建会自动禁用延迟加载,即使你显式地将LazyLoadingEnabled设置为true。好的,但是应该禁用延迟加载然后单独完成这个技巧吗?就像你说的。第一行就足够了。是的,我只是不明白为什么禁用延迟加载就足够了。这不应该删除与其他实体的关系吗?啊,好的。最后一个问题:无论我是否将ProxyCreationEnabled设置为false,我仍然能够使用EF intellisense根据彼此(外键)选择不同的实体吗?有一个链接。但必须显式加载相关实体。使用加载方法或包含方法-。如果你觉得这个答案有用的话,你可以投票表决。