您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

父级和子级与自己的类具有相同类型的实体框架代码第一类

父级和子级与自己的类具有相同类型的实体框架代码第一类

我不确定我是否正确理解您的模型。让我们讨论一下这些选项。

一会儿,我忽略了这个额外的实体,ChildContentRelationship并假设该ChildContent集合是typeICollection<Content>

我认为ParentContent是 的ChildContent。这意味着如果您有一个Contentwith Id= x,而此Content有一个ChildContentwith Id= y,则ChildContentsParentContentId必须始终为x。这仅是单个关联,ParentContent并且ChildContent是该相同关联的端点。

可以使用数据注释创建此关系的映射…

    [InverseProperty("ParentContent")]
public virtual ICollection<Content> ChildContent { get; set; }

…或使用Fluent API:

    modelBuilder.Entity<Content>()
    .HasOptional(c => c.ParentContent)
    .WithMany(c => c.ChildContent)
    .HasForeignKey(c => c.ParentContentId);

我认为这不是您想要的( “ …与…无关” )。不过,请考虑重命名导航属性。如果有人阅读Parent...并且Child...他很可能会假设他们为相同的关系建立了一对导航属性

ParentContent不是它的inverse属性ChildContent这意味着您实际上有两个独立的关系,并且两个关系的第二个端点都没有在模型类中公开。

的映射ParentContent如下所示:

    modelBuilder.Entity<Content>()
    .HasOptional(c => c.ParentContent)
    .WithMany()
    .HasForeignKey(c => c.ParentContentId);

WithMany()没有参数表示第二个端点不是模型类中的属性,尤其是 不是 ChildContent

现在,问题仍然存在:ChildContent属于哪种关系?是一对多关系还是多对多关系?

* 选项2a

如果aContent引用其他ChildContents并且不能有第二个Content引用相同的ChildContents(a的子代Content唯一的 ,可以这么说),那么您就有一对多的关系。(这类似于订单和订单商品之间的关系:一个订单商品只能属于一个特定的订单。)

的映射ChildContent如下所示:

            modelBuilder.Entity<Content>()
        .HasMany(c => c.ChildContent)
        .WithOptional(); // or Withrequired()

Content数据库表中将具有一个附加的外键列,该列属于该关联,但在实体类中没有对应的FK属性

* 选项2b

如果许多Content可以引用相同ChildContent的,则您具有多对多关系。(这类似于用户和角色之间的关系:同一角色中可以有许多用户,并且一个用户可以有许多角色。)

的映射ChildContent如下所示:

            modelBuilder.Entity<Content>()
        .HasMany(c => c.ChildContent)
        .WithMany()
        .Map(x =>
        {
            x.MapLeftKey("ParentId");
            x.MapRightKey("ChildId");
            x.ToTable("ChildContentRelationships");
        });

该映射将ChildContentRelationships数据库中创建一个联接表,但此表不需要相应的实体。

* 选项2c

仅在多对多关系除了两个键(ParentIdChildId)之外具有更多属性的情况下(例如,诸如CreationDateorRelationshipType或…),您才需要ChildContentRelationship在模型中引入一个新实体:

            public class ChildContentRelationship
    {
        [Key, Column(Order = 0)]
        public int ParentId { get; set; }
        [Key, Column(Order = 1)]
        public int ChildId { get; set; }

        public Content Parent { get; set; }
        public Content Child { get; set; }

        public DateTime CreationDate { get; set; }
        public string RelationshipType { get; set; }
    }

现在您的Content班级将有ChildContentRelationships的集合:

            public virtual ICollection<ChildContentRelationship> ChildContent
        { get; set; }

您有 两个 一对多的关系:

            modelBuilder.Entity<ChildContentRelationship>()
        .Hasrequired(ccr => ccr.Parent)
        .WithMany(c => c.ChildContent)
        .HasForeignKey(ccr => ccr.ParentId);

    modelBuilder.Entity<ChildContentRelationship>()
        .Hasrequired(ccr => ccr.Child)
        .WithMany()
        .HasForeignKey(ccr => ccr.ChildId);

我相信您想要选项2a或2b,但是我不确定。

其他 2022/1/1 18:34:12 有406人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶