如何在 EF Core 中配置固定长度列?

问题描述 投票:0回答:5

在之前的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
5个回答
19
投票

实际上,对于2.1版本来说,这是实现为:

entity.Property(e => e.Name).HasMaxLength(X).IsFixedLength();

18
投票

目前(EF Core 1.1.0)只能直接指定列类型:

.HasColumnType("char(123)")

请确保您的数据库引擎理解该值!它“按原样”传递。

另请注意,您应该在此处写入所有必需的尺寸/长度/精度值,因为

.HasMaxLength()
值将被忽略。


4
投票

对于像我今天早些时候所做的那样遇到此问题的任何人,如果您正在寻找 IsFixedLength() 函数,它是 Microsoft.EntityFrameworkCore.Relational 包中的 RelationalPropertyBuilderExtensions 类的扩展方法


0
投票

对于那些寻找更新示例的人,在 efcore 版本 6 中,您可以实现

IEntityTypeConfiguration
,并将注册包含在您的设置中,如下所示;

public class MyEntityConfiguration : IEntityTypeConfiguration<MyEntity>
{

    public void Configure(EntityTypeBuilder<MyEntity> builder)
    {
        builder.Property(o => o.MyProperty).HasMaxLength(2000);
    }
}

并包括您的

DbContext
课程的注册;

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());//Your assembly here
        base.OnModelCreating(builder);
    }

我个人更喜欢这种方法,因为您将关注点分离到不同的文件中,而不是使用单一的 DbContext。 这个答案并不排除其他答案,它只是一个附加选项。


0
投票

从 EF 7.0 开始,您可以添加自定义属性,恕我直言,这些属性比 Fluent API 更清晰。 然后,您可以将其与

MaxLength
StringLength
组合(这也会验证用户输入)

[StringLength(10), FixedLength]
public required string Foo { get; set; }

//instead of 
entityTypeBuilder
  .Property(b => b.Foo)
  .IsRequired()
  .HasMaxLength(10)
  .IsFixedLength();

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public sealed class FixedLengthAttribute : Attribute { }

public class FixedLengthAttributeConvention(ProviderConventionSetBuilderDependencies dependencies) : 
    PropertyAttributeConventionBase<FixedLengthAttribute>(dependencies)
{
    protected override void ProcessPropertyAdded(
        IConventionPropertyBuilder propertyBuilder,
        FixedLengthAttribute attribute,
        MemberInfo clrMember,
        IConventionContext context)
    {
        propertyBuilder.IsFixedLength(true);
    }
}


internal class DbContext : Microsoft.EntityFrameworkCore.DbContext
{
    protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
    {
        configurationBuilder.Conventions.Add(sp => new FixedLengthAttributeConvention(
            sp.GetRequiredService<ProviderConventionSetBuilderDependencies>()));

}
© www.soinside.com 2019 - 2024. All rights reserved.