如何在 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 层架构

如何配置 EF Core 5 以使 MS SQL Server 数据库生成 Guid 密钥

C# EF Core 模型独立 FK