【问题标题】:How to create the first version of database file from code EF Core如何从代码 EF Core 创建数据库文件的第一个版本
【发布时间】:2022-01-27 11:48:30
【问题描述】:

我是 EF Core 3.1.22 的新手,将它与我的 .NET 4.6 桌面应用程序一起使用。我可以使用包管理器控制台创建数据库和迁移,但是当数据库尚不存在时,我的代码在第一次运行时不会自行生成数据库文件。

如果我使用包管理器控制台中的Update-Database 创建数据库,则会创建文件。

如何更新此代码以在第一次运行时从代码生成数据库文件,然后对其应用database.migrate

public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>, IMyDbContextFactory
{       
    public MyDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
        optionsBuilder.UseSqlite($@"Data Source={DbConfiguration.GetDatabasePath()};", options =>
        {
            options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName);
        });

        return new MyDbContext(optionsBuilder.Options);
    }

    public MyDbContext CreateDbContext()
    {
        var dbcontext=  CreateDbContext(new[] { "" });
        dbcontext.Database.Migrate();
        return dbcontext;
    }
}

【问题讨论】:

  • 在迁移前尝试添加 context.Database.EnsureCreated()
  • @daremachine 我试过了,但是 Database.Migrate() 抛出表已经存在的异常。同样在 EnsureCreated() 的文档中,提到迁移不能应用于 EnsureCreated() 创建的数据库。
  • 能否请您为您的工厂添加DI配置?鉴于模式无法解决问题,我认为代码原样看起来不错。
  • 对不起,这是一个路径问题,但删除模式确实创建了数据库。我会将您的回复标记为答案。请添加。
  • 我现在已取消删除原始答案,很高兴它已解决。

标签: c# database sqlite entity-framework-core ef-core-3.1


【解决方案1】:

您的连接字符串不允许创建数据库,请参阅 SQLite 提供程序docs

要么将其更改为 Mode=ReadWriteCreate,要么将其完全删除,因为它是默认设置。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2014-07-16
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2018-09-18
    • 2013-10-11
    • 2013-12-26
    • 2021-07-03
    相关资源
    最近更新 更多