【问题标题】:How do I configure fixed length columns in EF Core?如何在 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()

还有其他方法吗?

【问题讨论】:

    标签: entity-framework ef-code-first entity-framework-core entity-framework-migrations ef-fluent-api


    【解决方案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 类的扩展方法

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2018-01-16
      • 2011-07-05
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多