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

.NET Core 3.1:如何用单个Code First模型生成三张SQL表?

解决方案:用单个模型生成三张相同结构的Code First表

你之前在OnModelCreating中链式调用.ToTable()的方式是错误的——每次调用都会覆盖前一次的表名配置,最终只有最后一个表名生效。下面提供两种可行的实现方式:

方案一:通过继承空实体类(最直观易维护)

这是最简单的实现方式,利用EF Core的实体继承特性生成独立表:

  1. 创建三个继承自ArchiveDataModel的空子类,无需额外属性:
public class ArchiveDataA : ArchiveDataModel { }
public class ArchiveDataB : ArchiveDataModel { }
public class ArchiveDataC : ArchiveDataModel { }
  1. 在ApplicationDbContext中声明这三个子类的DbSet:
public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

    public DbSet<ArchiveDataA> EventDataArchive_A { get; set; }
    public DbSet<ArchiveDataB> EventDataArchive_B { get; set; }
    public DbSet<ArchiveDataC> EventDataArchive_C { get; set; }
}
  1. (可选)如果需要指定表名(子类名与目标表名不一致时),在OnModelCreating中单独配置:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ArchiveDataA>().ToTable("EventDataArchive_A");
    modelBuilder.Entity<ArchiveDataB>().ToTable("EventDataArchive_B");
    modelBuilder.Entity<ArchiveDataC>().ToTable("EventDataArchive_C");
}

执行add-migration和update-database后,EF会生成三张结构完全一致的独立SQL表。

方案二:手动注册多实体映射(无需子类,但维护成本高)

如果不想创建子类,可以手动为同一个模型注册多个实体映射,但需要重复配置属性,后续模型变更时容易遗漏:

  1. 在OnModelCreating中分别注册三个独立的实体映射:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置第一张表
    modelBuilder.Entity<ArchiveDataModel>("ArchiveDataA")
        .ToTable("EventDataArchive_A")
        .HasKey(x => x.ID);
    modelBuilder.Entity<ArchiveDataModel>("ArchiveDataA")
        .Property(x => x.EventId).HasColumnType("nvarchar(max)");
    modelBuilder.Entity<ArchiveDataModel>("ArchiveDataA")
        .Property(x => x.EventData).HasColumnType("nvarchar(max)");
    modelBuilder.Entity<ArchiveDataModel>("ArchiveDataA")
        .Property(x => x.DateCreated).HasColumnType("nvarchar(max)");
    modelBuilder.Entity<ArchiveDataModel>("ArchiveDataA")
        .Property(x => x.DateArchived).HasColumnType("nvarchar(max)");

    // 配置第二张表
    modelBuilder.Entity<ArchiveDataModel>("ArchiveDataB")
        .ToTable("EventDataArchive_B")
        .HasKey(x => x.ID);
    // 重复上述属性配置...

    // 配置第三张表
    modelBuilder.Entity<ArchiveDataModel>("ArchiveDataC")
        .ToTable("EventDataArchive_C")
        .HasKey(x => x.ID);
    // 重复上述属性配置...
}
  1. 在ApplicationDbContext中手动暴露对应的DbSet:
public DbSet<ArchiveDataModel> EventDataArchive_A => Set<ArchiveDataModel>("ArchiveDataA");
public DbSet<ArchiveDataModel> EventDataArchive_B => Set<ArchiveDataModel>("ArchiveDataB");
public DbSet<ArchiveDataModel> EventDataArchive_C => Set<ArchiveDataModel>("ArchiveDataC");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:25:17