MigrateDatabaseToLatestVersion初始化器创建数据库失败

本文关键字:数据库 失败 创建 初始化 MigrateDatabaseToLatestVersion | 更新日期: 2023-09-27 18:05:14

我试图使用EF代码首先迁移来构建一个数据库,如果它不存在的话。到目前为止,我已经成功地完成了Enabled-Migrations。我还使用Add-Migrations进行构建数据库的初始迁移。脚本在Migrations方向上,看起来是正确的。

这是Main方法的主体

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());
var directConfigContext = new MyDbContext();

我读过的所有东西都说这是我所需要的。MyDbContextapp.config中,看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <connectionStrings>
        <add name="MyDbContext" connectionString="Data Source=(localdb)'v11.0;Initial Catalog=DbConfig;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

此外,如果我使用EF提供的DbMigrator类,则数据库将正确构建(可能使用初始数据库迁移脚本)。

// This is how it actually works including creating the database if it doesn't exist.
var dbMigrator = new DbMigrator(new Configuration());
dbMigrator.Update();

根据我的理解,在MyDbContext上设置初始化器,然后实例化DbContext应该将数据库创建到最新的迁移…我错过了什么?

MigrateDatabaseToLatestVersion初始化器创建数据库失败

实例化DbContext并不执行绑定到它的初始化器。相反,您需要更新数据库或直接调用底层数据库上的初始化器。

MyDbContext.MyEntity.Add(new MyEntity { Name = "Nelson" });
// Or
MyDb.Context.Database.Initialize(true); // force the initialization

接受的答案将为其他人解决问题,但我有同样的问题与不同的原因:我删除了我的数据库,并通过更改DbContext中的一些类修改了模型。

当我运行我的应用程序时,它第一次实例化并尝试使用DbContext,数据库没有创建,因为最后一次迁移没有反映我在DbContext中所做的最后更改。为了解决这个问题,我只需在包管理器控制台中运行Add-Migration命令添加一个新的迁移,下一次启动应用程序时,数据库就被正确地创建和运行了。