gpt4 book ai didi

c# - 代码优先迁移中的固定长度字符串列

转载 作者:行者123 更新时间:2023-11-30 15:24:56 25 4
gpt4 key购买 nike

我正在使用 Code First 迁移创建一个 Entity Framework 6 模型,我希望生成的数据库中的列是固定长度的而不是可变长度的;此外,我想以与 DBMS 无关的方式执行此操作。

ConventionPrimitivePropertyConfiguration.IsFixedLength方法似乎是为此目的而建立的。我找不到使用它的现有属性,所以我自己做了一个,如下所示:

using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Configuration;
using System.Data.Entity.ModelConfiguration.Conventions;

class FixedLengthAttribute : Attribute { }

class FixedLengthAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention<FixedLengthAttribute>
{
public override void Apply(ConventionPrimitivePropertyConfiguration configuration,
FixedLengthAttribute attribute)
{
configuration.IsFixedLength();
}
}

class MyModel : DbContext
{
internal virtual DbSet<MyEntity> MyEntities { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new FixedLengthAttributeConvention());
}
}

class MyEntity
{
[Key, FixedLength, StringLength(10)]
public string MyStringProperty { get; set; }
}

但是,当使用此代码运行 Add-Migration 时,在生成的迁移文件中定义该数据库列的行 (MyStringProperty = c.String(nullable: false, maxLength: 10 )) 没有说明固定长度。当我在数据库上运行此迁移时,我得到一个 NVARCHAR 列。

我在这里做错了什么?

最佳答案

StringLength 属性似乎覆盖了 FixedLength 属性。解决方法是将长度属性添加到您的 FixedLength 属性并自行设置 HasMaxLength

class FixedLengthAttribute : Attribute 
{
public int Length { get; set; }
}


public override void Apply(ConventionPrimitivePropertyConfiguration configuration,
FixedLengthAttribute attribute)
{
configuration.IsFixedLength();
configuration.HasMaxLength(attribute.Length);
}

class MyEntity
{
[Key, FixedLength(Length=10)]
public string MyStringProperty { get; set; }
}

关于c# - 代码优先迁移中的固定长度字符串列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32083600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com