代码优先迁移中的固定长度字符串列
Fixed-length string column in Code First Migrations
我正在使用 Code First Migrations 创建一个 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; }
}
但是,当 运行ning Add-Migration
使用此代码时,在生成的迁移文件 (MyStringProperty = c.String(nullable: false, maxLength: 10)
) 中定义该数据库列的行没有说明固定长度.当我 运行 在数据库上进行此迁移时,我得到一个 NVARCHAR 列。
我做错了什么?
StringLength
属性似乎覆盖了 [=12th=] 属性。解决方法是将长度 属性 添加到 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; }
}
Aducci's answer 的替代方法是使用 ColumnAttribute
指定列的数据类型:
class MyEntity
{
[Key]
[MaxLength(10)]
[Column(TypeName = "nchar")]
public string MyEntityId { get; set; }
}
这会导致 table 中的列:
MyEntityId nchar(10) NOT NULL PRIMARY KEY
就我个人而言,我认为这种方法更可取,因为它不需要覆盖 DbContext
的 Apply
函数。
我正在使用 Code First Migrations 创建一个 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; }
}
但是,当 运行ning Add-Migration
使用此代码时,在生成的迁移文件 (MyStringProperty = c.String(nullable: false, maxLength: 10)
) 中定义该数据库列的行没有说明固定长度.当我 运行 在数据库上进行此迁移时,我得到一个 NVARCHAR 列。
我做错了什么?
StringLength
属性似乎覆盖了 [=12th=] 属性。解决方法是将长度 属性 添加到 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; }
}
Aducci's answer 的替代方法是使用 ColumnAttribute
指定列的数据类型:
class MyEntity
{
[Key]
[MaxLength(10)]
[Column(TypeName = "nchar")]
public string MyEntityId { get; set; }
}
这会导致 table 中的列:
MyEntityId nchar(10) NOT NULL PRIMARY KEY
就我个人而言,我认为这种方法更可取,因为它不需要覆盖 DbContext
的 Apply
函数。