Database.CreateIfNotExists() 不创建表

问题描述 投票:0回答:1

我在 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 语句() 应该“在数据库服务器上为支持上下文中定义的模型创建一个新数据库”。

非常感谢任何帮助或见解!

c# .net visual-studio entity-framework entity-framework-6
1个回答
0
投票

实体框架使用迁移来维护数据库更改的版本控制和历史记录。 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

© www.soinside.com 2019 - 2024. All rights reserved.