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

EF Core 7复杂关系场景下POCO类创建问题

EF Core 7 Code First 实现指定表结构的POCO类与关系配置

1. 定义POCO实体类

创建与数据库表对应的实体类,包含字段和导航属性:

Company 类

public class Company
{
    public Guid Id { get; set; }
    public string Name { get; set; } = string.Empty;

    public Guid? CreatedBy { get; set; }
    public Guid? ModifiedBy { get; set; }

    public User? CreatedByUser { get; set; }
    public User? ModifiedByUser { get; set; }

    public ICollection<User> Users { get; set; } = new List<User>();
    public ICollection<Role> Roles { get; set; } = new List<Role>();
}

User 类

public class User
{
    public Guid Id { get; set; }
    public string Name { get; set; } = string.Empty;

    public Guid? RoleId { get; set; }
    public Guid? CompanyId { get; set; }
    public Guid? CreatedBy { get; set; }
    public Guid? ModifiedBy { get; set; }

    public Role? Role { get; set; }
    public Company? Company { get; set; }
    public User? CreatedByUser { get; set; }
    public User? ModifiedByUser { get; set; }

    public ICollection<Company> CreatedCompanies { get; set; } = new List<Company>();
    public ICollection<Company> ModifiedCompanies { get; set; } = new List<Company>();
    public ICollection<User> CreatedUsers { get; set; } = new List<User>();
    public ICollection<User> ModifiedUsers { get; set; } = new List<User>();
    public ICollection<Role> CreatedRoles { get; set; } = new List<Role>();
    public ICollection<Role> ModifiedRoles { get; set; } = new List<Role>();
}

Role 类

public class Role
{
    public Guid Id { get; set; }
    public string Name { get; set; } = string.Empty;

    public Guid? CompanyId { get; set; }
    public Guid? CreatedBy { get; set; }
    public Guid? ModifiedBy { get; set; }

    public Company? Company { get; set; }
    public User? CreatedByUser { get; set; }
    public User? ModifiedByUser { get; set; }

    public ICollection<User> Users { get; set; } = new List<User>();
}

2. 在DbContext中配置关系

由于存在多外键指向同一实体、自引用关系,必须通过Fluent API明确配置,避免EF Core自动生成错误关联:

public class AppDbContext : DbContext
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("你的数据库连接字符串");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 配置Company表关系
        modelBuilder.Entity<Company>()
            .HasOne(c => c.CreatedByUser)
            .WithMany(u => u.CreatedCompanies)
            .HasForeignKey(c => c.CreatedBy)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<Company>()
            .HasOne(c => c.ModifiedByUser)
            .WithMany(u => u.ModifiedCompanies)
            .HasForeignKey(c => c.ModifiedBy)
            .OnDelete(DeleteBehavior.Restrict);

        // 配置User表关系
        modelBuilder.Entity<User>()
            .HasOne(u => u.Role)
            .WithMany(r => r.Users)
            .HasForeignKey(u => u.RoleId)
            .OnDelete(DeleteBehavior.SetNull);

        modelBuilder.Entity<User>()
            .HasOne(u => u.Company)
            .WithMany(c => c.Users)
            .HasForeignKey(u => u.CompanyId)
            .OnDelete(DeleteBehavior.SetNull);

        modelBuilder.Entity<User>()
            .HasOne(u => u.CreatedByUser)
            .WithMany(u => u.CreatedUsers)
            .HasForeignKey(u => u.CreatedBy)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<User>()
            .HasOne(u => u.ModifiedByUser)
            .WithMany(u => u.ModifiedUsers)
            .HasForeignKey(u => u.ModifiedBy)
            .OnDelete(DeleteBehavior.Restrict);

        // 配置Role表关系
        modelBuilder.Entity<Role>()
            .HasOne(r => r.Company)
            .WithMany(c => c.Roles)
            .HasForeignKey(r => r.CompanyId)
            .OnDelete(DeleteBehavior.SetNull);

        modelBuilder.Entity<Role>()
            .HasOne(r => r.CreatedByUser)
            .WithMany(u => u.CreatedRoles)
            .HasForeignKey(r => r.CreatedBy)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<Role>()
            .HasOne(r => r.ModifiedByUser)
            .WithMany(u => u.ModifiedRoles)
            .HasForeignKey(r => r.ModifiedBy)
            .OnDelete(DeleteBehavior.Restrict);

        // 匹配数据库字段约束
        modelBuilder.Entity<Company>().Property(c => c.Name).HasMaxLength(255).IsRequired();
        modelBuilder.Entity<User>().Property(u => u.Name).HasMaxLength(255).IsRequired();
        modelBuilder.Entity<Role>().Property(r => r.Name).HasMaxLength(255).IsRequired();
    }
}

关键说明

  • 多外键与自引用:通过WithMany指定反向导航属性,明确每个外键对应的关联逻辑,避免EF Core混淆关系。
  • 删除行为:循环依赖的外键使用Restrict避免级联删除冲突;可空外键使用SetNull匹配数据库定义。
  • 字段约束:通过HasMaxLength和IsRequired对齐数据库表的字段规则。

内容的提问来源于stack exchange,提问作者A Stacker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:20:53