Установите тип столбца NCHAR вместо NVARCHAR с IEntityTypeConfiguration - PullRequest
1 голос
/ 11 октября 2019

Я использую EF Core 2.2.x и у меня есть таблица с 50+ строковыми столбцами. В моей миграции я хочу установить все это NCHAR вместо NVARCHAR. Все они имеют разную длину. Есть ли способ изменить тип SQL для всех столбцов одновременно, не устанавливая его вручную для каждого столбца? Я хочу сделать это в моем IEntityTypeConfiguration.

public class MyTableConfig : IEntityTypeConfiguration<MyTable>
{
    public void Configure(EntityTypeBuilder<MyTable> entity)
    {

        foreach (var property in entity.Metadata.GetProperties()
            .Where(p => p.ClrType == typeof(string)))
        {
            if (property.GetMaxLength() == null)
                property.SetMaxLength(256);

            // Can it be set from here?

        }

        entity.ToTable("MyTable", "fooSchema");


        entity.Property(e => e.Address1).HasMaxLength(30);
        entity.Property(e => e.Address2).HasMaxLength(20);

        /* A lot of other declarations below */

   }
}

Я знаю, что могу использовать IsFixedLength, но я хочу использовать его во всех столбцах.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Вместо IsFixedLength беглого API, в EF 2.x вы можете использовать IsFixedLength свойство RelationalPropertyAnnotations , возвращаемое Реляционным методом расширения:

property.Relational().IsFixedLength = true;

В EF Core 3.0+ то же самое достигается с помощью SetIsFixedLength метода расширения:

property.SetIsFixedLength(true);
0 голосов
/ 11 октября 2019
public void Configure(EntityTypeBuilder<DimActors> entity)
{
    foreach (var pb in entity.Metadata.GetProperties()
        .Where(p => p.ClrType == typeof(string))
        .Select(p =>
            new
            {
                PropertyBuilder = entity.Property(p.Name),
                Property = p
            }))
    {
        int length = pb.Property.GetMaxLength() ?? 256;
        pb.PropertyBuilder.HasColumnType($"NCHAR({length})");
    }
}
...