问题描述
TLDR; .HasColumnType() 的 Microsoft 文档指出“... 应该是完整的类型名称,包括精度、小数位数、长度...”。这似乎与此 stack overflow answer 相矛盾 - 推荐的用法是否已更改?
使用 EF Core 3.1(和 5)、sqlite 和 northwind 数据库,遵循 MJPrice Cs8 & .Net Core 3 Chapter14 中的示例,我使用 dotnet ef scaffold ...
创建类似的代码并与本书进行比较。这个工具生成了很多 .HasColumnType() 方法,没有 HasMaxLength() 方法。
将 .HasMaxLength(15)
替换为 .HasColumnType("nvarchar(15)")
时是否正确捕获了最大长度(例如 Category 的 CategoryName 属性)?
由于 SQLite stores types 的方式,.HasColumnType() 是否是不必要的,因此本示例中仅真正需要最大长度信息,即数据库提供程序是 sqlite?
解决方法
您指出的文档是针对 EF Core 的,而您链接的 stackoverflow 问题是指 EF 6。正如您在 documentation 中看到的,在 EF 6 HasColumnType
中只需要类型,没有精度、比例、长度等...。所以这已经改变了。
无论如何,我对 SQLite 了解不多,所以我在这里可能是错的,但我相信根本没有长度限制。即使您声明了 TEXT 或 VARCHAR 的大小,它也会 just ignore it.
请注意,SQLite 会忽略类型名称后面括号中的数字参数(例如:“VARCHAR(255)”)——SQLite 不会对字符串的长度施加任何长度限制(除了大的全局 SQLITE_MAX_LENGTH 限制) 、BLOB 或数值。