我有一个使用EF Core的应用程序,最初是使用V3.1.1编写的。我们决定冒险更新到v5.0.1版本,现在它已经停止预览了。
该应用程序同时支持MSSQL和SQLite,最初运行得很好。迁移在很大程度上是由工具创建的,这里的文档提供了三种使用多个数据库的方法:
- 创建多个上下文,并使用
--context
选项在它们之间切换为dotnet ef migrations
- 创建多个迁移程序集,并使用
MigrationsAssembly(...)
方法选择其中一个 - 依赖于这样一个事实,即工具创建的迁移大多是不可知的,并且在您确实需要做一些特定于DB的事情时,请使用
Migration
类中的方法来确定您在哪个DB上运行,并采取相应的行动
我们使用了选项3。
这导致了如下实体:
public class LocalUser
{
// id etc removed
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
创建如下迁移:
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
FirstName = table.Column<string>(nullable: true),
LastName = table.Column<string>(nullable: true),
Email = table.Column<string>(nullable: true),
}
它在MSSQL和SqlLite上都运行得很好,不需要手动修改生成的迁移文件。
然而,在升级到v5.0.1之后,现在创建了相同的迁移,如下所示(当配置为使用MSSQL运行时(:
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
FirstName = table.Column<string>(type: "nvarchar(max)", nullable: true),
LastName = table.Column<string>(type: "nvarchar(max)", nullable: true),
Email = table.Column<string>(type: "nvarchar(max)", nullable: true),
}
注意包含了解释性的type:
论点。
这现在无法在SQLite上运行,错误与";(max(";是一个语法错误-当然是这样。
此外,链接到上面的文档已经更新,删除了对选项3的任何讨论-针对多数据库支持讨论的仅有两个选项是多个派生上下文和多个迁移程序集-当数据库相当简单并且只存储核心类型时,这两个选项都是一个难题,就像我们的一样。
有人知道为什么这种行为会改变吗?是否有可能恢复以前的行为?(理想情况下,不必显式地将每个属性上的列类型设置为数据库不可知的东西,如"文本"(
感谢
遗憾的是,这已被确认为新的预期行为。
https://github.com/dotnet/efcore/issues/23714
现在可以进行多次迁移组装。