我使用以下CLI进行数据库迁移:
dotnet ef migrations add <Name-of-Migration>
dotnet ef database update
但是,我正在寻找一种自动发生的方法:当检测到模型发生变化时。
到目前为止,我已经能够通过在Startup.cs中执行以下操作来消除步骤2:
private void SetupDatabase(IApplicationBuilder app)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
//Migate any pending changes:
context.Database.Migrate();
}
}
这会迁移通过执行以下操作创建的所有待处理更改:
dotnet ef migrations add <Name-of-Migration>
但它不会为模型中的任何更改添加迁移。如何自动执行此migrations add
?
答案 0 :(得分:11)
<强>更新强>: 可以从代码中自动生成迁移的第一步,这是我个人不同意的设计决策。我的目标EF7仍然不可能像我最初所说的那样(它已经从EF7中删除了,如{I 3所提到的那样in this SO post以及this blog post中提到的member of Microsoft EF team ,但在Martin回复后在EF6中测试过。第二步可以自动进行,因为你已经发现了,所以我不会再次重现它。
第一步的步骤如下(在带有EF6的ASP.net MVC Web应用程序中):
Enable-Migrations –EnableAutomaticMigrations
。如果您的应用程序具有单个数据库上下文,则它也在那里应用了更改。public String TestField { get; set; }
Add-Migration
命令(希望如我在本答案的后面部分所指出的那样),您只需运行{ {1}}并且应该更新数据库,以使您的应用程序正常运行。为什么自动模型更改监控自动生成和更新数据库有时可能适得其反(以我的拙见和MSDN page):
上述内容可能并不适用于所有人,但我认为应该分享我同意设计决策的原因,即不将迁移生成和应用程序自动化生成数据库。
考虑启用自动迁移的每个人都应该阅读MSDN page了解更多示例和缺点。
答案 1 :(得分:6)
Entity Framework 4.3 has introduced the Automated Migrations
虽然我同意哈桑的回答,说明这可能非常棘手,但这个选项确实存在。
这是一份简短的简历:
enable-migrations -EnableAutomaticMigration:$ true
将自动生成配置类:
public Configuration()
{
AutomaticMigrationsEnabled = true;
//Set this parameter to true if you want to let auto-migration delete data when a property is removed from an entity.
//Not setting this will result in an exception when migration should remove a column.
AutomaticMigrationDataLossAllowed = true;
}
在Context类中设置DB Initializer
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, MyConfigurationClass>("MyConnectionString"));
然后你去,改变模型,看看变化......
我仍然不确定我会使用它,因为我希望我的数据库在我这么说时改变...