.NET Core 3.1:如何用单个Code First模型生成三张SQL表?
解决方案:用单个模型生成三张相同结构的Code First表
你之前在OnModelCreating中链式调用.ToTable()的方式是错误的——每次调用都会覆盖前一次的表名配置,最终只有最后一个表名生效。下面提供两种可行的实现方式:
方案一:通过继承空实体类(最直观易维护)
这是最简单的实现方式,利用EF Core的实体继承特性生成独立表:
- 创建三个继承自
ArchiveDataModel的空子类,无需额外属性:
public class ArchiveDataA : ArchiveDataModel { } public class ArchiveDataB : ArchiveDataModel { } public class ArchiveDataC : ArchiveDataModel { }
- 在
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; } }
- (可选)如果需要指定表名(子类名与目标表名不一致时),在
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表。
方案二:手动注册多实体映射(无需子类,但维护成本高)
如果不想创建子类,可以手动为同一个模型注册多个实体映射,但需要重复配置属性,后续模型变更时容易遗漏:
- 在
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); // 重复上述属性配置... }
- 在
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
相关产品推荐
相关产品推荐

