0

我有一个简单的项目,我用最初的SQL Server与EF核心和代码优先方法(以下这个教程:https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db)后端EF核心 - SQLServer迁移是否适用于SQLite?

现在我想切换的实施,SQLite的。我想我可以从SQL Server运行数据库创建的初始迁移并将其应用于SQLite。似乎它不能正常工作:例如。主键自动增加不适用,然后我看到一些不一致(sqlite抱怨'int'应该是'INTEGER')等

那么,这是否意味着迁移是后端依赖?如果是,不应该在嵌套文件夹中创建它们(例如,./Migrations/SQLServer)?

有人可以解释一下这是怎么工作的?

注意:对不起,我是EF Code-First和迁移新手......谢谢!

回答

3

是的,迁移依赖于后端。每个后端都有其特定的细节,因此迁移通常会有列规范等后端细节。

在一些ORM中,可以以抽象方式映射'代码优先'模型,并让后端特定提供程序将此抽象模型映射到后端特定类型,但在任​​何相对复杂的模型中,很难保留整个映射后端独立。

要移动到SQLite的,你可以改变你Startup.cs的配置,其中注册您的DbContext到像

services.AddDbContext<YourContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")))

然后,您可以指定使用“DOTNET EF为您的迁移显式路径迁移添加'命令。 This问题有关于设置显式文件夹路径的更多详细信息。

+0

THX,我看到了..我很高兴看到我的模型如此干净,没有任何后端依赖,我认为移民也将是独立的。其实我使用软件包管理器控制台中的“添加迁移”和“更新数据库”命令..很高兴我可以在那里找到一些参数以配置迁移文件夹? – Learner

+0

我已经看到这可能也有帮助.. https ://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell – Learner

2

Add-Migration/dotnet ef migrations add命令生成的迁移是后端特定的,但您可以手动编辑它们以使它们与多个后端兼容。最简单的方法是按@alwayslearning's answer中所述生成两组迁移,然后将它们组合成一个迁移集。

例如,Id列可能是这样的:

Id = table.Column<int>(nullable: false) 
    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn) 
    .Annotation("Sqlite:Autoincrement", true); 

您也可以有条件做的事情,可能是根本不同的后端之间:

if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.SqlServer") 
{ 
    // TODO 
} 
else if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.Sqlite") 
{ 
    // TODO 
}