首页 文章

桌面或移动应用程序中的实体框架核心迁移

提问于
浏览
0

我不想在这里听起来像个混蛋,但感觉就像在记录迁移时忘记了桌面和移动应用程序 .

鉴于:

  • 要求最终用户运行任何命令来创建或迁移数据库是不可接受的 .

  • 它不是Asp.Net核心Web应用程序,所以我没有startup.cs脚手架 .

  • 在用户设备上更新软件时,它必须在下次运行时更新自己的数据库而无需用户干预 .

  • 这是代码优先项目 .

我很确定这只是获取实体框架核心代码将使用的IOC容器并将正确的东西放入其中的问题,但如果我能弄清楚如何,我会被诅咒 . 尽管我有最好的google-jitsu和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!
}

2 回答

  • 0

    正确的原因是,在移动设备中迁移您的数据库确实没什么用处 . 由于你很可能使用SQLite(猜测)移动/ uwp应用程序没有得到一些与Web相同的处理,这是MS的功能,如果你没有注意到,目前不推动移动 . 不幸的是我们大多数早期采用者,但早起的鸟并不总是得到蠕虫 .

    那些做Desktop的人很可能会使用EF而不是EFC,而不是通常以SQLite为目标而是使用SqlExpress或SqlLocalDb

    我的应用程序的大部分更改都是对数据库的表面级别更改,但由于迁移系统的限制,您必须将自己的SQL编写到迁移的UP / Down中以删除SQLite中的列,反之则撤消更改 . The is a SQLite only limitation at present, for EFC provider.

    至于处理任何迁移的应用程序中的位置,因为我正在使用template10(目前在重构中),正在创建 UIElement CreateRootElement(IActivatedEventArgs e) . 另一个需要考虑的位置是应用程序的OnStartUp . 根据您正在进行的开发,它会有所不同XPlat可能在所有口味都可以利用的地方有意义 .

    同步数据时的一些应用程序我不打扰迁移,擦除和重新创建导致它从这个角度来看更容易,因为所有数据都是基于Azure的服务器 .

    可以说,对于SQLite和EFC,2.0有重大变化,如果正确读取,将会对你的应用程序的X.X版“迁移”或修改内容进行更多控制 .

  • 0

    我们的桌面应用程序使用EFCore和SQLite!这就是我们为InitialCreate迁移所做的,我不能谈到后续的迁移,但它们应该是相似的(解决方案留给读者练习):

    1.对于包含DBContext实现的项目,将csproj ItemGroup部分更改为include

    2.右键单击项目,然后在文件资源管理器中选择打开文件夹

    3.在命令窗口中输入cmd

    4.在命令窗口中输入:dotnet ef migrations add“xxx”,其中“xxx”是您的迁移名称,例如InitialCreate或AddNewTable

    5.这导致了一些错误消息,但最终它创建了一个包含3个新类的迁移文件夹 . Date_xxx.cs Date_xxx.Designer.cs和YourDBContextClassModelSnapshot.cs . 将文件夹和类添加到项目/源 .

    6.确保您的DBContext实现有一个空的ctor .

    7.使用context.DataBase.Migrate()将您的调用替换为context.DataBase.EnsureCreated()

    8.Rebuild,牺牲一些鸡,交叉你的手指,希望Migrate()现在创建一个带有版本/迁移信息的数据库 . 您可以编辑.DB文件,该文件主要是二进制文件,但会有一些如下所示的文本,这些文件在通过.EnsureCreate()创建时不存在

    “MigrationId”TEXT NOT NULL CONSTRAINT“PK___EFMigrationsHistory”PRIMARY KEY,“ProductVersion”TEXT NOT NULL

    注意:我第一次运行dotnet命令失败,因为没有加载EFCore设计器/工具 . 我做了一些项目重建,之后似乎工作了 . 此外,由于不同的项目引用了不同的版本,我在运行时遇到“EFCore程序集无法加载”崩溃时,我遇到了很多问题 . 一旦.csprojs被调整为引用相同版本,就进行了许多清理/重建以使其再次工作 . 此外,出于好奇,我尝试了“ef迁移删除”命令,但它无法执行(无法加载Sqlite3),幸运的是我们还不需要使用该cmd .

相关问题