使用Entity Framework 6 Code First模式无法新增数据库表的问题
问题:Entity Framework 6 未在现有数据库中生成新增的两张表
我需要通过Entity Framework 6在现有数据库中新增2张表,已完成实体类创建、在自定义TiDataDbContext中添加对应DbSet、配置迁移类,并在Global.asax中执行上下文初始化,但运行应用后数据库未生成目标表,请问可能的原因是什么?
自定义DbContext代码
public class TiDataDbContext : DbContext { public DbSet<TiData> TiDatas { get; set; } public DbSet<TiDataLanguage> TiDataLanguages { get; set; } public TiDataDbContext() : base("name=TestServerDB") { } public static void Initialize() { Database.SetInitializer(new MigrateDatabaseToLatestVersion<TiDataDbContext, TechDataMigrationsConfiguration>()); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //Manage auto update database var update = true; if (update) Database.SetInitializer(new MigrateDatabaseToLatestVersion<TiDataDbContext, TiDataMigrationsConfiguration>()); else Database.SetInitializer<TiDataDbContext>(null); modelBuilder.Entity<TiDataLanguage>() .HasKey(tdl => new { tdl.Id, tdl.LanguageId, tdl.TiDataId }); modelBuilder.Entity<TiDataLanguage>() .HasRequired(tdl => tdl.TiDatas) .WithMany(td => td.TiDataLanguages) .HasForeignKey(tdl => tdl.TiDataId); } }
迁移配置类代码
internal sealed class TiDataMigrationsConfiguration : DbMigrationsConfiguration<TiDataDbContext> { public TiDataMigrationsConfiguration() { AutomaticMigrationsEnabled = true; MigrationsDirectory = "Migrations"; AutomaticMigrationDataLossAllowed = true; // Needed to be able to update tables } protected override void Seed(TiDataDbContext context) { context.TiDatas.Create(); context.TiDataLanguages.Create(); context.SaveChanges(); } }
实体类代码
[Table("Demo.TiData")] public class TiData { public int TiDataId { get; set; } public string Name { get; set; } public string Unit { get; set; } public ICollection<TiDataLanguage> TiDataLanguages { get; set; } } [Table("Demo.TiDataLanguage")] public class TiDataLanguage { public int Id { get; set; } public int LanguageId { get; set; } public int TiDataId { get; set; } public string Name { get; set; } public string Unit { get; set; } public TiData TiData { get; set; } }
Global.asax 初始化代码
TiDataDbContext.Initialize();
可能的原因分析
- 初始化器类型不匹配:
TiDataDbContext.Initialize()方法中使用的是TechDataMigrationsConfiguration,但实际定义的迁移配置类是TiDataMigrationsConfiguration,类型名称不一致会导致初始化器无法找到正确的迁移配置,无法执行迁移。 - 上下文未被触发访问:仅调用
Database.SetInitializer不会自动触发迁移,必须首次访问上下文实例(比如执行查询、保存操作)时才会触发初始化逻辑。如果应用启动后没有任何操作访问TiDataDbContext,迁移就不会执行。 - 连接字符串错误:检查配置文件中
TestServerDB连接字符串是否正确指向目标数据库实例。若连接字符串错误,EF会连接到错误的数据库,自然看不到新增表。 - 迁移历史表冲突:现有数据库的
__MigrationHistory表中可能存在TiDataDbContext的错误记录,导致EF认为已应用最新迁移。可检查该表,删除错误条目后重新触发迁移。 - 实体映射配置错误:
TiDataLanguage的导航属性映射时写了tdl => tdl.TiDatas(复数),但实体类中该属性是TiData(单数),映射错误会导致EF无法正确生成表结构。TiDataLanguage的复合主键包含Id字段,若Id是自增主键,复合主键的设置不符合预期,会导致EF无法生成正确的主键约束,影响表创建。
- Seed方法无效:
Seed方法中调用context.TiDatas.Create()和context.TiDataLanguages.Create()是无效操作,Create()用于创建实体实例而非表,这部分代码不会触发表生成,还可能引发错误。
内容的提问来源于stack exchange,提问作者MTplus
相关产品推荐
相关产品推荐

