Существует несколько атрибутов, косвенно влияющих на тип столбца свойства string
- MaxLength
(например, varchar(256)
против varchar(MAX)
, IsUnicode
(например, nvarchar
против varchar
) и IsFixedLength
(например, char
против varchar
).
API текущей модели несовместим. Первый доступен через GetMaxLength
и SetMaxLength
, второй- через IsUnicode
и IsUnicode
, и нет общедоступного API модели для третьего (только свободный API).
Итак, чтобы установить MaxLength
вы можете использовать:
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(string)))
{
if (property.GetMaxLength() == null)
property.SetMaxLength(256);
}
, что не совсем правильно, потому что null
в этом случае имеет двойное значение - не указано и MAX
.
. Для правильного использования требуетсяВнутренний API EF Core, который предоставляет гораздо больше методов конфигурации, в частности, позволяет передавать перечислимое значение ConfigurationSource
вместе со значением атрибута. Значения enum * 1038 определяют приоритет конфигурации - с Convention
будучи самым низким, то DataAnnotation
и, наконец, Explicit
самым высоким. Вся идея в том, что низшее первичноеКонфигурация Rity не перезаписывает конфигурацию, уже установленную с более высоким приоритетом.Все общедоступные API используют Explcit
, в то время как в нашем случае Convention
идеально подходит (поскольку мы имитируем обычные значения по умолчанию).
Так что, если вы принимаете предупреждение "Этот API поддерживает Entity FrameworkБазовая инфраструктура и не предназначена для использования непосредственно из вашего кода. Этот API может изменяться или удаляться в будущих выпусках. ", добавьте
using Microsoft.EntityFrameworkCore.Metadata.Internal;
и используйте
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(string)))
{
property.AsProperty().Builder
.HasMaxLength(256, ConfigurationSource.Convention);
}