我在 Entity Framework 6 中使用代码优先方法进行迁移。我对现有数据库进行了逆向工程,以创建一个名为 MyDbContext 的 DbContext 类,其中包含我的数据库模型及其 200 个左右的表。我想要发生的是,如果我为不存在的数据库提供连接字符串,我的程序将根据 MyDbContext 中的模型创建一个新数据库,或者如果连接字符串是针对确实存在的数据库,它只会正常连接,我将能够看到/应用迁移。
到目前为止,我的后者运行良好,但是当我为不存在的数据库提供连接字符串时,实体框架会创建数据库,但 MyDbContext 中的任何表都不会添加到数据库中,除了 __MigrationHistory 表在 EF6 中使用空的 Up() 和 Down() 运行初始迁移时创建。
启动时我的程序运行这些行:
var context = new MyDbContext(connectionString);
context.Database.CreateIfNotExists();
其中“connectionString”是我不存在的数据库的连接字符串,而 MyDbContext 是我对数据库进行逆向工程时创建的 DbContext 类。
MyDbContext 文件如下所示:
public MyDbContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer(new CreateDatabaseIfNotExists<MyDbContext>());
Database.Initialize(true);
}
and then 200ish lines of DbSets describing my model
我的 InitialCreate 迁移文件如下所示:
public partial class InitialCreate : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
我发现,如果我在我的 Up() 方法中添加一堆“如果不存在则创建表”SQL 语句,那么它将创建表,但是根据 Microsoft Database.CreateIfNotExists,我宁愿不写 200 条 sql 语句() 应该“在数据库服务器上为支持上下文中定义的模型创建一个新数据库”。
非常感谢任何帮助或见解!
实体框架使用迁移来维护数据库更改的版本控制和历史记录。 EF Core 中的迁移功能提供了一种增量更新数据库模式的方法,以使其与应用程序的数据模型保持同步,同时保留数据库中的现有数据。
您不希望 EF 在没有任何记录的情况下只创建您的表。当您尝试跨多个环境维护此数据库时,这很容易导致问题。
EF 确实提供了为您生成迁移的工具:
dotnet ef migrations add InitialCreate
EF Core 会在你的项目中创建一个名为 Migrations 的目录,并生成一些文件。最好检查 EF Core 究竟生成了什么——并可能对其进行修改
https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli