Максимальная длина, не применяемая в миграции
Я использую efcore.sqlserver 1.0.1 с инструментами preview2 – у меня есть свойство строки, которое в sql-сервере создается как nvchar (max). Когда я добавляю значение длины строки (100) аннотации данных к свойству и добавляю новую миграцию, миграция вообще не изменяет столбец.
Однако, если я добавляю аннотацию Required и StringLength, то сгенерированная миграция изменяет столбец и показывает (.. maxLength: 100, nullable: false)
Почему это делается только в том случае, если я изменяю значение NULL?
- Ядро структуры Entity: выражение свойства «xx» недопустимо. Выражение должно представлять доступ к свойствам: 't => t.MyProperty'
- Entity Framework 7 не вставляет дату и время
- Пустое имя пользователя при показе sys.processes
- Основные данные аннотаций базы данных Entity Framework
- EF Core Left Join, а затем Inner Join
- Как я могу получить объект со всеми его свойствами навигации, заполненными в базе данных с наложением TPH наследования с использованием EF Core?
- Asp Net Core: подключение к существующему SqlServer
- EF 7: инструкция INSERT противоречит ИНОСТРАННОЙ КЛЮЧЕВОЙ ТАБЛИЦЕ
- Какое наилучшее решение для ядра Entity Framework не поддерживает умеренную поддержку запросов LINQ?
- .net core и ef core sql server поставщик ошибок: сетевые интерфейсы SQL, ошибка: 8 - протокол не поддерживается
- Exec хранимой процедуры с выходным параметром в Entity Framework Core 2
- UWP / EF Core SqlServer - зависимость потоков
- Обновление до EF 7.0.0-rc1-final сломало SQL DbContextOptionsBuilder UseSqlServer
Я считаю, что вам нужно использовать MaxLengthAttribute
вместо StringLengthAttribute
.
https://docs.efproject.net/en/latest/modeling/max-length.html#data-annotations
Вероятно, это связано с StringLength
атрибут StringLength
имеет минимальную длину, которая не поддерживается на основе SQL, поэтому атрибут MaxLength
лучше подходит для этого варианта использования.
Чтобы быть ясными, атрибуты не влияют сами по себе. Они могут содержать логику и информацию, но должны использоваться путем отражения от другой части кода во время нормальной модели выполнения. Это за исключением определенных атрибутов, которые компилятор получает особый смысл, например атрибут Conditional
.
РЕДАКТИРОВАТЬ
Автор обнаружил, что это известная проблема для случаев, когда набор инструментов был обновлен с RC2 => RTM.
К счастью, в EF нет такой проблемы 🙂 Я протестировал ваш сценарий, и он работает нормально.
Вы должны использовать для этого атрибут [MaxLength(100)]
Вот документ: Аннотации данных MaxLength
Тестовый случай: я использовал MaxLength как 500 для моего теста.
Во-первых, я создал свойство, подобное этому:
public string Title { get; set; }
После миграции:
После этого я изменил его так:
[MaxLength(500)] public string Title { get; set; }
После миграции:
Сгенерированный скрипт:
migrationBuilder.AlterColumn<string>( name: "Title", table: "Posts", maxLength: 500, nullable: true);
Протестированные версии инструментов:
<package id="Microsoft.EntityFrameworkCore.Tools" version="1.0.0-preview2-final" targetFramework="net461" developmentDependency="true" />