我有一个使用 EF Core 的应用程序,最初是使用 V3.1.1 编写的。我们决定冒险更新到 v5.0.1,现在它已经不再预览了。
该应用程序支持 MSSQL 和 SQLite,最初运行得很好。迁移的创建基本上与工具和文档无关here https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/providers提供了3种使用多个数据库的方法:
- 创建多个上下文并使用以下命令在它们之间切换
--context
选项dotnet ef migrations
.
- 创建多个迁移程序集并使用
MigrationsAssembly(...)
method.
- 依赖于这样一个事实:工具创建的迁移大多是不可知的,有时您确实需要执行特定于数据库的操作,请使用
Migration
类来确定您正在运行的数据库并采取相应的行动。
我们使用了选项 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),
}
它在 MYSQL 和 Sqlite 上都能很好地工作 - 无需对生成的迁移文件进行任何手动修改。
然而,升级到 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 的任何讨论 - 对于多数据库支持讨论的唯一两个选项是多个派生上下文和多个迁移程序集 - 当数据库相当简单且和我们一样,只存储核心类型。
有谁知道为什么这种行为被改变以及是否有可能恢复其以前的行为? (理想情况下,无需将每个属性的列类型显式设置为与数据库无关的内容,例如“文本”)
Thanks