我创建了一个简单的 Web API 项目来测试 EF 迁移。我在程序包管理器控制台中调用了 Add-Migration Initial,并创建了初始迁移和文件夹。现在我运行我的项目,我期望它自动创建数据库。但事实并非如此,它会引发登录错误。
我已调用 Update-Database 并创建了数据库。
它不应该在访问上下文时自动创建数据库吗?当我添加新的迁移文件时会怎样?当它看到快照与数据库不同时,它会在运行时自动更新我的数据库吗(或者它是否使用迁移表)?
总而言之,问题是:
EF Core 迁移可以在应用程序运行时自动创建数据库吗?
当 EF Core 迁移检测到存在差异时,是否可以在应用程序运行时自动更新数据库?
它用什么来比较差异?实际的数据库结构和快照?
如果自动更新,如果我手动删除迁移会怎样?数据库中的快照和迁移表会不同步,对吗?会发生什么?
如果无法在运行时自动创建/更新,如何向客户部署数据库和更改?
您可以通过添加以下内容在
Startup.cs
中自动运行迁移:
var dbFactory = new DataContextFactory();
var dbContext = dbFactory.Create(new DbContextFactoryOptions());
dbContext.Database.Migrate();
DataContextFactory
是实现IDbContextFactory<DataContext>
的工厂。
EF core 不支持
Automatic Migrations
。所以你必须手动完成。
从自动迁移作为一项功能的角度来看,我们不是 计划在 EF Core 中实现它,因为经验表明代码库 迁移成为一种更易于管理的方法。
您可以在这里阅读全文:不实施自动迁移
您可以使用 .NET Core CLI 来了解如何执行此操作
了解如何使用 包管理器控制台 (Visual Studio)
.Net6 或更高版本
我使用以下代码,它对我来说效果很好
using (var scope = builder.Services.BuildServiceProvider().CreateScope())
{
using(var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>())
{
if (dbContext.Database.GetPendingMigrations().Any())
{
dbContext.Database.Migrate();
}
}
}