You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:54:59