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
相关产品推荐
相关产品推荐

