在之前的EF中,我可以这样做:
entityTypeBuilder
.Property(b => b.Foo)
.IsRequired()
.HasMaxLength(10)
.IsFixedLength();
这会生成类似的迁移
Foo = c.String(nullable: false, maxLength: 10, fixedLength: true)
但是在 EF Core 中没有
IsFixedLength()
。
还有其他方法可以做到这一点吗?
实际上,对于2.1版本来说,这是实现为:
entity.Property(e => e.Name).HasMaxLength(X).IsFixedLength();
目前(EF Core 1.1.0)只能直接指定列类型:
.HasColumnType("char(123)")
请确保您的数据库引擎理解该值!它“按原样”传递。
另请注意,您应该在此处写入所有必需的尺寸/长度/精度值,因为
.HasMaxLength()
值将被忽略。
对于像我今天早些时候所做的那样遇到此问题的任何人,如果您正在寻找 IsFixedLength() 函数,它是 Microsoft.EntityFrameworkCore.Relational 包中的 RelationalPropertyBuilderExtensions 类的扩展方法
对于那些寻找更新示例的人,在 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。 这个答案并不排除其他答案,它只是一个附加选项。
从 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>()));
}