我不想在这里听起来像个混蛋,但感觉就像在记录迁移时忘记了桌面和移动应用程序 .
鉴于:
-
要求最终用户运行任何命令来创建或迁移数据库是不可接受的 .
-
它不是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 回答
正确的原因是,在移动设备中迁移您的数据库确实没什么用处 . 由于你很可能使用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版“迁移”或修改内容进行更多控制 .
我们的桌面应用程序使用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 .