首先在EF代码中指向同一类的2个属性

时间:2011-08-16 08:25:18

标签: entity-framework entity-framework-4.1 fluent-interface

我有一个讨论对象,其中有一个ParentDiscussion和TopParentDiscussion:

 public class Discussion
    {
        [Key]
        public Guid ID { get; set; }
        public String Message { get; set; }
        public virtual Discussion ParentDiscussion { get; set; }
        public virtual Discussion TopParentDiscussion { get; set; }

    }

Parent和TopParent都是可选的。我使用Fluent API编写了以下情况,它可以正常工作。

        modelBuilder.Entity<Discussion>().HasOptional<Discussion>(a => a.ParentDiscussion).WithOptionalDependent().Map(a => a.MapKey("TopParentId"));
        modelBuilder.Entity<Discussion>().HasOptional<Discussion>(a => a.TopParentDiscussion).WithOptionalDependent().Map(a => a.MapKey("ParentId"));

但是如何在没有流畅api的情况下编写此解决方案,因此使用数据注释。

我试过了:

        //Foreign Keys
        public Guid? ParentId { get; set; }
        public Guid? TopParentId { get; set; }

        //Relationships

        [ForeignKey("ParentId")]
        public virtual Discussion ParentDiscussion { get; set; }
        [ForeignKey("TopParentId")]
        public virtual Discussion TopParentDiscussion { get; set; }

但它给了我以下错误:

Unable to determine the principal end of an association between the types 'Model.Discussion' and 'Model.Discussion'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

1 个答案:

答案 0 :(得分:0)

您无法使用数据注释进行映射,因为您不公开外键属性和反向导航属性。

使用流畅的API进行正确的映射:

modelBuilder.Entity<Discussion>()
            .HasOptional<Discussion>(a => a.ParentDiscussion)
            .WithMany()
            .Map(a => a.MapKey("TopParentId"));
modelBuilder.Entity<Discussion>()
            .HasOptional<Discussion>(a => a.TopParentDiscussion)
            .WithMany()
            .Map(a => a.MapKey("ParentId"));

因为您希望讨论成为多于一个其他讨论的父母。