2011-11-02 77 views
5

将EF实体转换为json对象时,我在循环引用方面遇到了一些问题。我发现我工作的解决方案,但我想知道,当IM添加分散EF实体;禁用代理创建和延迟加载?

context.ContextOptions.ProxyCreationEnabled = false; 

和/或

context.ContextOptions.LazyLoadingEnabled = false; 

第一个似乎是够得着什么是真正发生的事情单维json对象。我应该同时使用吗?他们实际上做了什么?有更聪明的方法吗?谢谢

+0

我注意到你的上一篇文章,你正在使用JavaScriptSerializer ..有一个特定的原因呢?这是一个Web应用程序?我认为你应该采取不同的方法来获取你的json,比如DataContractJsonSerializer或者Json.NET库。 –

+0

@SeanThoman我试过使用json.net,但仍然得到了循环引用异常。这是一个普通的asp.net 4.0网页表单应用程序。你有没有使用DataContractJsonSerializer的例子? – Johan

回答

6

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

第二行关闭延迟加载。假设你有Parent实体和Child实体。当您请求“家长”时,如果延迟加载处于打开状态,则不会加载“孩子”。当它加载的时候关闭,你加载它的所有孩子。我认为这是你应该熟悉的东西,如果你正在使用EF。

编辑: 如果循环引用有问题,那么你应该关闭延迟加载。然后,当你序列化父母,你不会尝试序列化有参考父母的孩子(创建循环引用)

+0

好的,但应该禁用懒加载单独做伎俩呢? – Johan

+0

就像你说的。第一条线就够了。 –

+0

是的,我只是不明白为什么禁用延迟加载就够了。不应该删除与其他实体的关系? – Johan