Entity framework core 桌面或移动应用程序中的实体框架核心迁移
我不想在这里听起来像个混蛋,但在记录迁移时,感觉桌面和移动应用程序已经被遗忘了 鉴于:Entity framework core 桌面或移动应用程序中的实体框架核心迁移,entity-framework-core,Entity Framework Core,我不想在这里听起来像个混蛋,但在记录迁移时,感觉桌面和移动应用程序已经被遗忘了 鉴于: 要求最终用户运行任何命令来创建或迁移数据库是不可接受的 它不是Asp.Net核心web应用程序,因此我没有startup.cs框架 当软件在用户设备上更新时,它必须在下次运行时更新自己的数据库,而无需用户干预 这是一个代码优先的项目 我敢肯定,这只是一个获取实体框架核心代码将使用的IOC容器并将正确的东西放入其中的问题,但如果我能弄清楚如何操作,我会被诅咒的。尽管我有最好的google柔术和bing fu
- 要求最终用户运行任何命令来创建或迁移数据库是不可接受的
- 它不是Asp.Net核心web应用程序,因此我没有startup.cs框架李>
- 当软件在用户设备上更新时,它必须在下次运行时更新自己的数据库,而无需用户干预
- 这是一个代码优先的项目
public void SomeDesktopAppStartupMethod()
{
var context = new DesktopAppContext();
// ??? - register some migration locator with the IOC container? ¯\(°_o)/¯
context.Database.Migrate();
// Profit!
}
正确的原因是,在移动设备中,数据库的迁移实际上并没有太多。由于您很可能正在使用SQLite(猜测)mobile/uwp应用程序,因此不会得到与Web相同的处理。如果您没有注意到,这是MS目前不推动移动的功能。不幸的是,对于我们大多数早期采用者来说,早起的鸟儿并不总是有虫吃 做桌面的人很可能会使用EF而不是EFC,并且通常不会以SQLite为目标,而是SqlExpress或SqlLocalDb 我对我的应用程序所做的大多数更改都是对数据库的表面级更改,但由于迁移系统的限制,您必须将自己的SQL写入迁移的上/下部分,以在SQLite中删除列,反之则撤消更改对于EFC提供程序,目前仅限于SQLite。 至于我在应用程序中处理迁移的位置,因为我正在使用template10(目前正在进行重构),在创建
UIElement CreateRootElement(IActivatedEventArgs e)
的位置完成迁移。另一个需要考虑的地方是应用程序的OnStartUp。它会根据您正在进行的开发而有所不同,当然,在所有口味都可以利用的地方,XPlat可能是有意义的
有些应用程序在同步数据时,我不需要迁移、擦除和重新创建,因为从这个角度来看,所有数据都是基于Azure的服务器,所以比较容易
也就是说,2.0对SQLite和EFC进行了重大更改,如果阅读正确,将可以更好地控制如何从应用程序的X.X版本“迁移”或修改内容 我们的桌面应用程序正在使用EFCore和SQLite!这就是我们为InitialCreate迁移所做的,我不能谈论后续迁移,但它们应该是类似的(解决方案留给读者作为练习): 1.对于包含DBContext实现的项目,将csproj ItemGroup部分更改为包含 2.在项目上单击鼠标右键,然后在文件资源管理器中选择“打开文件夹” 3.在命令窗口中输入cmd 4.在命令窗口中输入:dotnet ef migrations添加“xxx” 其中“xxx”是迁移的名称,例如InitialCreate或AddNewTable 5.这给我带来了一些错误消息,但最终它创建了一个 包含3个新类的迁移文件夹。Date_xxx.cs Date_xxx.Designer.cs和YourDBContextClassModelSnapshot.cs。将文件夹和类添加到项目/源中 6.确保DBContext实现具有空的ctor 7.将对context.DataBase.encurecreated()的调用替换为 context.DataBase.Migrate() 8.重建,牺牲几只鸡,交叉手指,希望Migrate()现在可以创建一个包含版本/迁移信息的数据库。您可以编辑.DB文件,该文件主要是二进制文件,但会有一些文本,如下面所示,通过.ensurereate()创建时不存在这些文本 “MigrationId”文本非空约束“PK___;EFMigrationHistory”主键, “ProductVersion”文本不为空
注意:第一次运行dotnet命令时失败,因为没有加载EFCore设计器/工具。我做了一些项目重建,之后它似乎起了作用。此外,在运行期间,由于引用不同版本的不同项目,“EFCore程序集无法加载”崩溃,我对该应用程序也有很多问题。当.csprojs被调整为引用同一版本时,需要进行多次清理/重建才能再次工作。另外,出于好奇,我尝试了“ef migrations remove”命令,但它没有执行(无法加载Sqlite3),幸运的是我们还不需要使用该命令。你能澄清一下为什么在应用程序启动期间调用
context.Database.Migrate()
不起作用吗?你有错误吗?