代码第一个约定不在实体框架6.2中的多对多关系上创建连接表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码第一个约定不在实体框架6.2中的多对多关系上创建连接表相关的知识,希望对你有一定的参考价值。

我有一些名为YogaProfile,YogaSpace和YogaSpaceEvent的实体,它们都是。一对多(例如,YogaProfile-> YogaSpace-> YogaSpaceEvent)把它想象成一个学生到教室,一个课堂活动。

仅供参考 - 我使用的是EF6.2,而不是7

我想在YogaProfile和YogaSpaceEvent之间创建一个多对多的关系。恩。学生可以注册许多课堂活动,课堂活动可以有很多学生。我正在关注这些链接herehere以获取代码首次多对多实现

但是当我运行add-migration时,迁移文件不包含任何连接表(例如YogaProfileYogaSpaceEvent),当我更新数据库时,仍然没有连接表。

这是我的迁移文件的样子

public override void Up()
    {
        AddColumn("dbo.YogaSpaceEvents", "YogaProfile_YogaProfileId", c => c.Int());
        AddColumn("dbo.YogaProfiles", "YogaSpaceEvent_YogaSpaceEventId", c => c.Int());
        CreateIndex("dbo.YogaSpaceEvents", "YogaProfile_YogaProfileId");
        CreateIndex("dbo.YogaProfiles", "YogaSpaceEvent_YogaSpaceEventId");
        AddForeignKey("dbo.YogaSpaceEvents", "YogaProfile_YogaProfileId", "dbo.YogaProfiles", "YogaProfileId");
        AddForeignKey("dbo.YogaProfiles", "YogaSpaceEvent_YogaSpaceEventId", "dbo.YogaSpaceEvents", "YogaSpaceEventId");
    }

这就是我在实体YogaProfile和YogaSpaceEvent上所做的事情

public class YogaProfile {
  public YogaProfile() {
      YogaSpaceEvents = new List<YogaSpaceEvent>();
  }
  public virtual ICollection<YogaSpaceEvent> YogaSpaceEvents { get; set; }
}

public class YogaSpaceEvents {
   public YogaSpaceEvents() {
      RegsiteredStudents = new List<YogaProfile>();
   }
   public virtual ICollection<YogaProfile> RegisteredStudents { get; set; }
}
答案

尝试HashSet而不是List:

public class YogaProfile {
  public YogaProfile() {
      YogaSpaceEvents = new HashSet<YogaSpaceEvent>();
  }
  public virtual int YogaProfileId{ get; set; }
  public virtual ICollection<YogaSpaceEvent> YogaSpaceEvents { get; set; }
}

public class YogaSpaceEvents {
   public YogaSpaceEvents() {
      RegisteredStudents = new HashSet<YogaProfile>();
   }
   public virtual int YogaSpaceEventId { get; set; }
   public virtual ICollection<YogaProfile> RegisteredStudents { get; set; }
}

而且我建议使用FluentApi显式映射实体。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<YogaProfile>()
                .HasMany<Course>(s => s.YogaSpaceEvents)
                .WithMany(c => c.RegisteredStudents )
                .Map(cs =>
                        {
                            cs.MapLeftKey("YogaProfileId");
                            cs.MapRightKey("YogaSpaceEventId");
                            cs.ToTable("YogaSpaceEventsRegisteredStudents");
                        });

}

以上是关于代码第一个约定不在实体框架6.2中的多对多关系上创建连接表的主要内容,如果未能解决你的问题,请参考以下文章

实体框架中的多对多关系导致无限循环

实体框架代码优先,同一张表上的多对多关系

实体框架代码优先的多对多关系的最佳方法

使用 SQL 和 Linq 的多对多关系(实体框架/实体)

EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

在不使用实体框架的多对多中插入记录