如何在 EF Core 中配置固定长度的列?
Posted
技术标签:
【中文标题】如何在 EF Core 中配置固定长度的列?【英文标题】:How do I configure fixed length columns in EF Core? 【发布时间】:2017-04-08 12:47:43 【问题描述】:在之前的 EF 中,我可以这样做:
entityTypeBuilder
.Property(b => b.Foo)
.IsRequired()
.HasMaxLength(10)
.IsFixedLength();
这会产生类似的迁移
Foo = c.String(nullable: false, maxLength: 10, fixedLength: true)
但是在 EF Core 中没有 IsFixedLength()
。
还有其他方法吗?
【问题讨论】:
【参考方案1】:目前(EF Core 1.1.0)只能直接指定列类型:.HasColumnType("char(123)")
请确保您的数据库引擎了解此值!它“按原样”传递。
另外请注意,您应该在此处填写所有必需的尺寸/长度/精度值,因为.HasMaxLength()
值将被忽略。
【讨论】:
很遗憾,EF Core 似乎并不“完整”。另外,according to docs 有一个最大长度... EF Core 并不是 E6 的完全替代品,有很多issues on github。作为一种解决方法,您可以创建自己的扩展方法 (IsFixedLength(length)
),它调用 HasColumnType($"char(length)")
并从一个地方控制所有这些魔术字符串。
关于HasMaxLength
- 是的,它存在并且工作正常。但是,如果您将 HasColumnType("char(123)")
和 HasMaxLength(100)
应用于相同的属性/列 - 123“获胜”。
我正在处理旧代码并且遇到了 MS SQL 超时问题。我注意到我在使用 varchar(8000) 而不是 varchar(1) 时遇到了 MS SQL / C# 的问题。该代码使用 HasColumnType("char"),人们会认为这是单个字符,但事实并非如此。如果您使用 HasColumnType("char"),它将在 DB 端默认为 varchar(8000)。 char 是固定大小的字节,可以在 1-8000 之间,因此它使用 varchar(8000)。感谢您的回答。这为我节省了很多时间。
如果有人感兴趣,这个链接解释了 char 与 varchar 的关系 - docs.microsoft.com/en-us/sql/t-sql/data-types/…【参考方案2】:
实际上,对于 2.1 版,这是这样实现的:
entity.Property(e => e.Name).HasMaxLength(X).IsFixedLength();
【讨论】:
这个被删除了吗?我找不到这个。 @Martijn 确保您在依赖关系图中的某处有 Microsoft.EntityFrameworkCore.Relational,因为 IsFixedLength() 函数是不在主要 Microsoft.EntityFrameworkCore 程序集中的扩展方法。【参考方案3】:如果您正在寻找 IsFixedLength() 函数,那么对于像我今天早些时候遇到此问题的任何人来说,它是 Microsoft.EntityFrameworkCore.Relational 包中 RelationalPropertyBuilderExtensions 类的扩展方法
【讨论】:
以上是关于如何在 EF Core 中配置固定长度的列?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 EF.core 中使用 FromSqlRaw 指定列
如何在 EF Core 5 中为自定义 SQL 配置导航属性
如何删除一列并创建一个新列而不是在 EF Core 中重命名?
如何使用 EF Core 代码优先迁移为 ASP.NET Core MVC 配置 N 层架构