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框架
  • 当软件在用户设备上更新时,它必须在下次运行时更新自己的数据库,而无需用户干预
  • 这是一个代码优先的项目
我敢肯定,这只是一个获取实体框架核心代码将使用的IOC容器并将正确的东西放入其中的问题,但如果我能弄清楚如何操作,我会被诅咒的。尽管我有最好的google柔术和bing fu,但我只能找到在web项目中使用startup.cs或使用Entity Framework核心CLI工具运行的文档或示例

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()
不起作用吗?你有错误吗?