Реконструирование

Реконструирование — это процесс формирования шаблонов классов типов сущностей и класса DbContext на основе схемы базы данных. его можно выполнить с помощью Scaffold-DbContext команды в средствах EF Core диспетчер пакетов Console (PMC) или dotnet ef dbcontext scaffold команды интерфейса командной строки (CLI) .net.

Предварительные требования

  • перед реконструированием необходимо установить либо средства PMC (только Visual Studio), либо средства CLI. Дополнительные сведения см. в ссылках.
  • установите пакет NuGet для Microsoft.EntityFramework.Design в проекте, для которого выполняется формирование шаблонов.
  • Вам также потребуется установить соответствующий поставщик базы данных для схемы базы данных, которую необходимо реконструировать.

строку подключения.

Первым аргументом команды является строка подключения к базе данных. Эти средства будут использовать эту строку соединения для чтения схемы базы данных.

Способ заключения и экранирования строки подключения зависит от того, какая оболочка используется для выполнения команды. Дополнительные сведения см. в документации по оболочке. Например, PowerShell требует экранирования $ символа, но не \ .

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

Конфигурация и секреты пользователя

при наличии проекта ASP.NET Core можно использовать Name=<connection-string> синтаксис для считывания строки подключения из конфигурации.

Это хорошо работает со средством диспетчера секретов , чтобы пароль базы данных не оставался в своей базе кода.

dotnet user-secrets set ConnectionStrings:Chinook "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook"
dotnet ef dbcontext scaffold Name=ConnectionStrings:Chinook Microsoft.EntityFrameworkCore.SqlServer

Имя поставщика

Вторым аргументом является имя поставщика. имя поставщика обычно совпадает с именем пакета NuGet поставщика.

Указание таблиц

По умолчанию все таблицы в схеме базы данных реконструированы в типы сущностей. Можно ограничить, какие таблицы реконструировать реконструирование, указав схемы и таблицы.

--schemaПараметр может использоваться для включения каждой таблицы в схему, в то время как --table может использоваться для включения конкретных таблиц.

Чтобы включить несколько таблиц, укажите параметр несколько раз:

dotnet ef dbcontext scaffold ... --table Artist --table Album

Сохранение имен

Имена таблиц и столбцов устраняются, чтобы лучше соответствовать соглашениям об именовании .NET для типов и свойств по умолчанию. При указании параметра -UseDatabaseNames в PMC или --use-database-names в .NET Core CLI будет отключено это поведение по мере возможности. Недопустимые идентификаторы .NET по-прежнему будут исправлены, а синтезированные имена, такие как свойства навигации, по-прежнему будут соответствовать соглашениям об именовании .NET.

Fluent API или заметки к данным

типы сущностей настраиваются по умолчанию с помощью API Fluent. Укажите -DataAnnotations вместо них (PMC) или --data-annotations (.NET Core CLI) использование заметок к данным, если это возможно.

например, с помощью API Fluent будет сформировано следующее:

entity.Property(e => e.Title)
    .IsRequired()
    .HasMaxLength(160);

При использовании заметок к данным будет сформировано следующее:

[Required]
[StringLength(160)]
public string Title { get; set; }

Имя DbContext

Шаблонное имя класса DbContext по умолчанию будет именем базы данных с суффиксом context . Чтобы указать другую, используйте -Context в PMC и --context в .NET Core CLI.

Каталоги и пространства имен

Классы сущностей и класс DbContext обрабатываются в корневом каталоге проекта и используют пространство имен по умолчанию проекта.

Можно указать каталог, в котором разрабатываются классы с помощью --output-dir , и --context-dir можно использовать для формирования шаблона класса DbContext в отдельный каталог из классов типов сущностей:

dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

По умолчанию пространством имен будет корневое пространство имен и имена всех подкаталогов в корневом каталоге проекта. Однако из Ефкоре 5,0 можно переопределить пространство имен для всех выходных классов с помощью --namespace . Также можно переопределить пространство имен только для класса DbContext, используя --context-namespace :

dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace

Принцип работы

Реконструирование начинается с считывания схемы базы данных. Он считывает сведения о таблицах, столбцах, ограничениях и индексах.

Затем он использует сведения о схеме для создания модели EF Core. Таблицы используются для создания типов сущностей. столбцы используются для создания свойств; и внешние ключи используются для создания связей.

Наконец, модель используется для создания кода. для повторного создания той же модели из приложения создаются соответствующие классы типов сущностей, Fluent API и заметки данных.

Ограничения

  • Не все сведения о модели можно представить с помощью схемы базы данных. Например, сведения о иерархиях наследования, принадлежащих типахи разбиении таблиц отсутствуют в схеме базы данных. По этой причине эти конструкции никогда не будут обрабатываться в обратном порядке.
  • Кроме того, некоторые типы столбцов могут не поддерживаться поставщиком EF Core. Эти столбцы не будут включаться в модель.
  • В модели EF Core можно определить маркеры параллелизма, чтобы запретить двум пользователям одновременно обновлять одну и ту же сущность. некоторые базы данных имеют специальный тип для представления этого типа столбца (например, rowversion в SQL Server). в этом случае можно выполнить реконструирование этой информации, однако другие маркеры параллелизма не будут обрабатываться в обратном порядке.
  • До EF Core 6 функция ссылочного типа c# 8 Nullable не поддерживалась в обратном проектировании: EF Core всегда созданный код c#, который предполагает, что функция отключена. например, столбцы типа text, допускающие значение null, были сформированы как свойство с типом string , а не string? с Fluent API или заметками данных, используемыми для настройки того, является ли свойство обязательным. При использовании более ранней версии EF Core можно изменить сформированный код и заменить их на метки допустимости значений NULL в C#.

Настройка модели

Кодом, созданным EF Core, является ваш код. Вы можете изменить его. Он будет создан повторно только в том случае, если реконструировать ту же модель снова. Шаблонный код представляет одну модель, которую можно использовать для доступа к базе данных, но, конечно, не единственная модель, которую можно использовать.

Настройте классы типов сущностей и класс DbContext в соответствии с вашими потребностями. Например, можно переименовать типы и свойства, ввести иерархии наследования или разделить таблицу на несколько сущностей. Можно также удалить Неуникальные индексы, неиспользуемые последовательности и свойства навигации, необязательные скалярные свойства и имена ограничений из модели.

Можно также добавить дополнительные конструкторы, методы, свойства и т. д. Использование другого разделяемого класса в отдельном файле. Этот подход работает даже в том случае, если планируется реконструировать модель снова.

Обновление модели

После внесения изменений в базу данных может потребоваться обновить модель EF Core, чтобы отразить эти изменения. Если изменения базы данных просты, возможно, проще всего вручную внести изменения в модель EF Core. Например, переименование таблицы или столбца, удаление столбца или обновление типа столбца являются тривиальными изменениями для внесения в код.

Однако внесение более значительных изменений не так просто делать вручную. Один из распространенных рабочих процессов — реконструирование модели из базы данных с помощью -Force (PMC) или --force (CLI) для перезаписи существующей модели обновленной.

Еще одна часто запрашиваемая функция — возможность обновления модели из базы данных с сохранением настроек, таких как переименование, иерархии типов и т. д. Чтобы отслеживать ход выполнения этой функции, используйте #831 выдача.

Предупреждение

При повторном конструировании модели из базы данных все изменения, внесенные в файлы, будут потеряны.

Совет

если вы используете Visual Studio, расширение сообщества Power tools EF Core , графическое средство, которое строится на основе EF Core программ командной строки, предлагает дополнительные параметры рабочего процесса и настройки.