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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:05:39