Язык программирования C#9 и платформа .NET5
Если инструменту не удалось его найти, то экземпляр класса, производного от
, будет создаваться с использованием конструктора без параметров. Если ни того и ни другого не существует, тогда команда потерпит неудачу. Обратите внимание, что вариант с конструктором без параметров требует наличия переопределенной версииDbContext, что не считается хорошей практикой.OnConfiguring()Лучший (и на самом деле единственный) вариант — всегда создавать реализацию
для каждого класса, производного отIDesignTimeDbContextFactory<TContext>, который присутствует в приложении.DbContextЧтобы вывести список всех аргументов и параметров для команды, введите
в окне командной строки, например:dotnet ef <команда> -hdotnet ef migrations add -hНа заметку! Важно отметить, что команды CLI — это не команды С#, а потому правила отмены символов обратной косой черты и кавычек здесь не применяются.
Команды для управления миграциями
Команды
используются для добавления, удаления, перечисления и создания сценариев миграций. После того, как миграция применена к базе данных, в таблицеmigrationsсоздается запись. Команды для управления миграциями кратко описаны в табл. 22.11 и более подробно в последующих подразделах.__EFMigrationsHistoryКоманда add
Команда
создает новую миграцию базы данных, основываясь на текущей объектной модели. Процесс исследует каждую сущность со свойствомaddв производном отDbSet<T>классе (и каждую сущность, которая может быть достигнута из таких сущностей с использованием навигационных свойств) и выясняет, есть ли какие-то изменения, которые должны быть применены к базе данных. При наличии изменений генерируется надлежащий код для обновления базы данных. Вскоре вы узнаете об этом больше.DbContextКоманда
требует передачи параметра name, который используется при именовании созданного класса и файлов для миграции. В дополнение к общим параметрам параметрaddили-о <путь>указывает, куда должны помещаться файлы миграции. Стандартный каталог называется--output-dir <путь>и относителен к текущему пути.MigrationsДля каждой добавленной миграции создаются два файла с частичными определениями того же самого класса. Имена обоих файлов начинаются с отметки времени и наименования миграции, которое было указано в качестве параметра для команды
. Первый файл называетсяadd, а второй —<ГГГГММДДЧЧММСС>_<НаименованиеМиграции>.cs. Отметка времени основана на том, когда файл был создан, и в точности совпадает для обоих файлов. Первый файл представляет код, сгенерированный для изменений базы данных в этой миграции, а конструирующий файл — код, который предназначен для создания и обновления базы данных на основе всех миграций до этой миграции включительно.<ГГГГММДДЧЧММСС>_<НаименованиеМиграции>.Designer.csГлавный файл содержит два метода,
иUp(). В методеDown()находится код для обновления базы данных с учетом изменений этой миграции. В методеUp()содержится код для выполнения отката изменений этой миграции. Ниже приведен неполный листинг начальной миграции, рассматриваемой ранее в главе (Down()):One2Manypublic partial class One2Many : Migration{protected override void Up(MigrationBuilder migrationBuilder){migrationBuilder.CreateTable(name: "Make",columns: table => new{Id = table.Column<int>(type: "int", nullable: false).Annotation("SqlServer:Identity", "1, 1"),Name = table.Column<string>(type: "nvarchar(max)", nullable: true),TimeStamp = table.Column<byte[]>(type: "varbinary(max)",nullable: true)},constraints: table =>{table.PrimaryKey("PK_Make", x => x.Id);});...migrationBuilder.CreateIndex(name: "IX_Cars_MakeId",table: "Cars",column: "MakeId");}protected override void Down(MigrationBuilder migrationBuilder){migrationBuilder.DropTable(name: "Cars");migrationBuilder.DropTable(name: "Make");}}Как видите, метод
создает таблицы, столбцы, индексы и т.д. МетодUp()удаляет созданные элементы. По мере необходимости механизм миграции будет выдавать операторыDown(),alterиadd, чтобы гарантировать соответствие базы данных вашей модели.dropКонструирующий файл содержит два атрибута, которые связывают частичные определения с именем файла и классом, производным от
. Ниже показан фрагмент листинга конструирующего класса с упомянутыми атрибутами:DbContext

