【发布时间】: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