dotnet-ef dbcontext 脚手架在与 SQLite 一起使用时生成 HasColumnType 包括长度与 HasMaxLength

Posted

技术标签:

【中文标题】dotnet-ef dbcontext 脚手架在与 SQLite 一起使用时生成 HasColumnType 包括长度与 HasMaxLength【英文标题】:dotnet-ef dbcontext scaffold generates HasColumnType includes length vs HasMaxLength when used with SQLite 【发布时间】:2021-06-07 09:21:48 【问题描述】:

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?

【问题讨论】:

【参考方案1】:

您指出的文档适用于 EF Core,而您链接到的 *** 问题是指 EF 6。正如您在 documentation 中看到的那样,在 EF 6 HasColumnType 中只需要类型,没有 精度、比例、长度等......。所以这已经改变了。

无论如何,我对 SQLite 了解不多,所以我在这里可能错了,但我相信根本没有长度限制。即使您声明 TEXT 或 VARCHAR 的大小,它也会 just ignore it.

请注意,SQLite 会忽略类型名称后面的括号中的数字参数(例如:“VARCHAR(255)”) - SQLite 不会对字符串的长度施加任何长度限制(除了大的全局 SQLITE_MAX_LENGTH 限制) 、BLOB 或数值。

【讨论】:

以上是关于dotnet-ef dbcontext 脚手架在与 SQLite 一起使用时生成 HasColumnType 包括长度与 HasMaxLength的主要内容,如果未能解决你的问题,请参考以下文章

EF Core Scaffold DbContext

如何在执行scaffold dbcontext时复数集合?

无法使用连接字符串名称运行支架 dbcontext

zsh:找不到命令:dotnet-ef

实体框架脚手架和迁移不起作用

dotnet-ef 与 net50 不兼容