DOTNET EF迁移自动化:检测用于迁移
我使用DB迁移以下CLI变化:DOTNET EF迁移自动化:检测用于迁移
dotnet ef migrations add <Name-of-Migration>
dotnet ef database update
不过,我正在寻找一种方式要做到这一点自动:检测到模型发生变化时。
到目前为止,我已经能够消除步骤2将在做Startup.cs如下:
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
?
已更新: 可以自动从代码中移动生成迁移的第一步,这是我个人不同意的设计决定。它仍然不可能在你的目标EF7中,正如我原先所说的那样(它已经从EF7中删除了,看起来像in this SO post以及this blog post由member of Microsoft EF team所提到的在Ivan的评论中提到),但在Martin回复后在EF6中进行了测试。第二步可以自动化,因为你也已经发现了,所以我不会再重现它。是
的第一步步骤如下(在ASP.net MVC Web应用程序与EF6):
- 在你的项目(这应该已经有一些模型和一致的状态中运行),去包管理器控制台并运行
Enable-Migrations –EnableAutomaticMigrations
。如果您的应用程序具有单个数据库上下文,则它也会应用这些更改。 - 现在转到现有模型并在其中添加一个新字段,例如
public String TestField { get; set; }
- 作为代码首先自动迁移是ON,则不需要再次运行
Add-Migration
命令(希望,因为我在这个答案的后半部分指出),你只要运行Update-Database
和DB应该让你更新应用程序运行良好。
为什么自动模式变化监测,生成和更新数据库中自动有时可能会适得其反(愚见和MSDN page):
- 自动迁移外地的变化不会工作重命名,按MSDN。
- 在添加原始字段类型的情况下,需要考虑现有数据,并且在这种情况下您应该考虑手动迁移。
- 您可以穿插自动和基于代码的迁移,但这不建议在团队开发方案中使用。如果您是使用源代码管理的开发团队的一员,则应使用纯自动迁移或纯粹基于代码的迁移。鉴于自动迁移的限制,MSDN建议在团队环境中使用基于代码的迁移。
- 它很好地确认模型更改是故意的,并且不是某些剩余代码在更改期间产生的结果,可能发生的情况和自动执行完整过程可能会导致对数据库的更改。
- 由于某些数据限制或类似问题,生成的迁移并不总是被优化和/或失败,因此应该审查。
- 即使在迁移正在处理的负载数据的某些情况下,甚至更新数据库也会在生产数据上超时。我们不得不手动远程运行它并重新启动服务器。
以上可能并不适用于所有人,但我认为应该分享为什么我同意没有将迁移生成和应用程序设置为自动化数据库的设计决定的原因。
每个考虑启用自动迁移的人都应该确定阅读MSDN page以获取更多示例和缺点。
*对于EF7,如果我找到一种方式(或其他人),将更新此答案。*不要浪费你的时间搜索。请阅读EF核心团队成员[bricelam](https://www.bricelam.net/2014/12/16/ef7-migrations-designtime.html)的[EF Core Migrations:Design-time] //*.com/users/475031/bricelam)解释了为什么自动迁移已从EF Core中删除。 –
Entity Framework 4.3 has introduced the Automated Migrations。
尽管我同意哈桑的回答,说这可能非常棘手,但这个选项确实存在。
这里是一个简短的简历:
- 启用迁移,必须在程序包管理器控制台提供了一个参数:
启用的迁移-EnableAutomaticMigration:$真
-
配置类将自动生成一个LLY产生:
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; }
-
设置DB初始化程序在你的上下文类
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, MyConfigurationClass>("MyConnectionString"));
而且你去那里,更改模型,看到了变化......
我米仍然不知道我会使用它,因为我想我的数据库改变,当我这么说...
不错的发现马丁,我也继续阅读更多关于它,并发现他们MSDN有一个页面上的例子,虽然它带有警告,它不会在字段重命名和更多的问题可以出现在团队环境,所以他们也不鼓励继续传播。从来没有选择似乎在那里。 – Hassan
@Hassan你能链接MSDN页吗?我认为这个答案的一个大标题警告声明这种用法是不鼓励的,可能会对未来的读者有所帮助。 –
是的这是我最后阅读的内容 https://msdn.microsoft.com/zh-cn/library/jj554735%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396 我要更新我的答案很快就有了更多细节,只需测试几件事情就可以了。 – Hassan
嗯,继这一个。 – user3581203
由于某种原因,以前的版本无法通过脚本运行(至少在忽略更改的情况下) –
EF7中不可能至少自动生成迁移(在我们以前使用过的EF6中没有看到过)。我认为这是EF团队的一个设计决定,可以理解为imo。 – Hassan