使用Entity Framework Core配置实体多对多关系及自定义表结构
问题解答
1. 当前多对多关系建立方式的正确性及自定义中间表配置
你的实体类结构在EF Core 5.0及以上版本是完全正确的——EF Core从5.0开始支持无需显式定义中间连接实体的多对多关系,框架会自动生成中间表。但默认生成的表名、列名不符合需求时,可以通过OnModelConfiguring方法里的Fluent API自定义:
在你的DbContext类中重写OnModelConfiguring,添加如下配置:
protected override void OnModelConfiguring(ModelBuilder modelBuilder) { // 配置Machine与User的多对多关系 modelBuilder.Entity<Machine>() .HasMany(m => m.users) .WithMany(u => u.machines) .UsingEntity(j => j // 指定中间表名称 .ToTable("UserMachineRelations") // 配置Machine对应的外键列名 .HasOne<Machine>() .WithMany() .HasForeignKey("MachineId") .OnDelete(DeleteBehavior.Cascade) // 配置User对应的外键列名 .HasOne<User>() .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) ); }
这段代码会生成名为UserMachineRelations的中间表,外键列分别为MachineId和UserId,替代默认的MachineUser、machinesid、usersid。
2. 指定多对多关系的所有者端
多对多关系本身没有一对多那样严格的“所有者/从属端”区分,但可以通过Fluent API的配置入口来指定关系的主导配置端,也就是你所说的“所有者端”:
比如你想把Machine作为所有者端,就从Machine实体开始配置关系(如上面的代码示例);如果想把User作为所有者端,就从User实体出发配置:
modelBuilder.Entity<User>() .HasMany(u => u.machines) .WithMany(m => m.users) .UsingEntity(j => j .ToTable("UserMachineRelations") .HasOne<User>() .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .HasOne<Machine>() .WithMany() .HasForeignKey("MachineId") .OnDelete(DeleteBehavior.Cascade) );
本质上,这个“所有者端”就是你用来启动关系配置的实体,EF Core会以这个配置为准生成关系结构,两种配置方式最终生成的数据库结构是一致的,只是配置的起始点不同。
内容的提问来源于stack exchange,提问作者Emirhan Ay
相关产品推荐
相关产品推荐

