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

时间:2017-05-30 15:19:22

标签: entity-framework-core

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

假设:

  • 要求最终用户运行任何命令来创建或迁移数据库是不可接受的。
  • 它不是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 :(得分:0)

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

很可能那些正在使用EF而非使用EF而不是EFC的人通常不会使用SQLite而是使用SqlExpress或SqlLocalDb

我的应用程序的大部分更改都是对数据库的表面级别更改,但由于迁移系统的限制,您必须将自己的SQL编写到迁移的UP / Down中以删除SQLite中的列,反之亦然撤消您的更改。 对于EFC提供商而言,目前只是SQLite限制。

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

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

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

答案 1 :(得分: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.EnsureCreated() context.DataBase.Migrate()

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。