【问题标题】:2 properties pointing to the same class in EF code first2个属性首先在EF代码中指向同一个类
【发布时间】:2011-08-16 08:25:18
【问题描述】:

我有一个讨论对象,它本身有一个 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.

【问题讨论】:

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


    【解决方案1】:

    您不能将其与数据注释映射,因为您不公开外键属性和反向导航属性。

    使用 fluent 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"));
    

    因为您可能希望某个讨论成为多个其他讨论的父级。

    【讨论】:

    • 好的,谢谢,只是想知道这是否可能。只是另一个快速的问题。当我想根据 ParentDiscussion 查找所有讨论时,我曾经只是做 .Where(d => d.ParentId == SomeGuid) 因为我通过数据注释有一个外键。但是使用此解决方案我必须执行以下操作。Where(d => d.ParentDiscussion.Id == SomeGuid),这不会导致实际 ParentDiscussion 的额外负载吗?或者 EF 会将 ParentDiscussion.Id 翻译成“ParentId”属性?
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多