C# & EF Core:两表多关系正确配置及冗余列消除
问题描述
现有用户模型User_Profiles和订单模型order,已通过EF Core配置关联,关联可运行但数据库表中生成了冗余的user_profileid列,请问如何正确配置这类关联并避免冗余列?
现有模型代码
用户模型 User_Profiles
public class User_Profiles { public int id { get; set; } public string Name { get; set; } public List<order>? orders { get; set; } }
订单模型 order
public class order { public int id { get; set; } public int Сreated_UserID { get; set; } public User_Profiles Сreated_User { get; set; } public int ExecudedUserID { get; set; } public User_Profiles ExecudedUser { get; set; } }
现有关联配置
modelBuilder.Entity<order>() .HasOne(ps => ps.Сreated_User) .WithMany() .HasForeignKey(ps => ps.Сreated_UserID) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity<order>() .HasOne(ps => ps.ExecudedUser) .WithMany() .HasForeignKey(ps => ps.ExecudedUserID) .OnDelete(DeleteBehavior.Restrict);
问题原因
冗余列user_profileid的出现,是因为EF Core无法自动匹配User_Profiles中的orders集合与订单模型的两个关联(创建人、执行人),它会默认给未明确映射的集合生成额外的外键列。
解决方法
方案1:明确指定orders集合对应创建人关联
修改关联配置,在WithMany方法中明确指定用户模型的orders集合:
modelBuilder.Entity<order>() .HasOne(ps => ps.Сreated_User) .WithMany(u => u.orders) // 关联到User_Profiles的orders集合 .HasForeignKey(ps => ps.Сreated_UserID) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity<order>() .HasOne(ps => ps.ExecudedUser) .WithMany() // 此关联不绑定用户模型的集合 .HasForeignKey(ps => ps.ExecudedUserID) .OnDelete(DeleteBehavior.Restrict);
方案2:用户模型添加两个独立订单集合(更清晰的设计)
如果需要让用户同时追踪自己创建和执行的订单,建议修改User_Profiles模型,拆分出两个独立集合:
public class User_Profiles { public int id { get; set; } public string Name { get; set; } public List<order>? CreatedOrders { get; set; } // 自己创建的订单 public List<order>? ExecutedOrders { get; set; } // 自己执行的订单 }
再修改关联配置,分别映射这两个集合:
modelBuilder.Entity<order>() .HasOne(ps => ps.Сreated_User) .WithMany(u => u.CreatedOrders) .HasForeignKey(ps => ps.Сreated_UserID) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity<order>() .HasOne(ps => ps.ExecudedUser) .WithMany(u => u.ExecutedOrders) .HasForeignKey(ps => ps.ExecudedUserID) .OnDelete(DeleteBehavior.Restrict);
以上两种方案都能让EF Core明确每个关联的映射关系,避免生成冗余的外键列。
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

