实现IEntityWithRelationships会导致相关对象停止加载

时间:2012-01-26 07:05:22

标签: c# entity-framework-4.1 json.net

我有两个设置了多对多关系的实体:

类别:

    public class Category : IEntityWithRelationships
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        public virtual ICollection<User> Users { get; set; }

        //Json.NET needs this in order to serialize the object
        private RelationshipManager rm;
        RelationshipManager IEntityWithRelationships.RelationshipManager
        {
            get
            {
                if (rm == null)
                    rm = RelationshipManager.Create(this);

                return rm;
            }
        }
    }

用户:

    public class User
    {

        public int Id { get; set; }

        public ICollection<Category> Categories { get; set; }
    }

相关对象加载正常,但后来我需要将类别对象序列化为Json并且Json.Net不断抛出:

  

无法序列化RelationshipManager对象。这类   当RelationshipManager属于一个对象时,无法序列化对象   没有实现IEntityWithRelationships的实体对象。

所以我实现了IEntityWithRelationships接口,但现在我的相关对象没有加载。

我尝试了自定义ContractResolver,但我仍然得到上述例外情况。如何加载我的相关对象?

2 个答案:

答案 0 :(得分:1)

你不能在EF课程中进行这种交流,因为EF不会创建代理的=&gt; Lazy loading已关闭。 http://msdn.microsoft.com/en-us/library/dd468057.aspx。实际上,当你必须序列化你的人时,人们建议你关闭LazyLoading(当然,实现这个界面并不是正确的方法)。您应该准备更多关于如何使用序列化EntityFramework

答案 1 :(得分:0)

您不应该在代码优先实体中实现该接口。实现该接口违反了POCO。它是&#34; heavy&#34; EF实体和使用它将使EF处理POCO的方式失去作用。

我想你想要做的唯一原因是循环引用的问题。您应该能够solve it而无需指定任何API特定接口。