Куда поместить строку подключения при перемещении кода базы данных в отдельную сборку

У меня есть веб-приложение Razor Pages, и я хочу переместить код базы данных в отдельный проект/сборку, на который ссылается мой основной проект/сборка.

Создать новый проект класса и переместить файлы из моих папок Данные и Модель очень просто. Но я не совсем понимаю, куда идет моя строка подключения (в настоящее время она находится в appsettings.json для моего основного проекта).

Как указать строку подключения для моей библиотеки классов?


person Jonathan Wood    schedule 11.06.2021    source источник
comment
какую версию .net вы используете?   -  person Gabriel Martinez Bustos    schedule 11.06.2021
comment
@ГабриэльМартинесБустос: 5.0. Пожалуйста, смотрите мои теги вопроса.   -  person Jonathan Wood    schedule 11.06.2021
comment
Вы хотите, чтобы указанная сборка выполнялась в том же процессе, что и ваш веб-сайт? Или он должен работать как независимая служба данных?   -  person Matt E.    schedule 11.06.2021
comment
@MattE.: Я хочу, чтобы он работал в том же процессе, что и мой веб-сайт, точно так же, как в одном проекте. Единственная разница в том, что я могу написать новое приложение, которое может ссылаться на новую сборку библиотеки и получать доступ к этим объектам.   -  person Jonathan Wood    schedule 11.06.2021
comment
Вы можете подумать, что библиотека классов использует файл appsettings.json, содержащийся в ее собственном проекте, но это не так. Он использует файл appsettings.json проекта, который на него ссылается. Так что держите его в основном проекте и не беспокойтесь об этом. Если вы планируете использовать ту же библиотеку классов в другом веб-проекте, добавьте эти настройки приложения в его основной проект.   -  person Akshay Gaonkar    schedule 11.06.2021
comment
@AkshayGaonkar: Я все это понимаю. Но для добавления миграций и обновления базы данных я не запускаю никаких приложений.   -  person Jonathan Wood    schedule 11.06.2021


Ответы (1)


Строка подключения должна быть настроена в том же проекте, где службы подключаются к DbContext, поэтому вы можете оставить appsettings.json как есть.

Именно проект настройки (тот, который настраивает все зависимости) устанавливает подключение к БД, а инструменту миграции EF требуется подключение для отслеживания и применения изменений. Любая сборка может использоваться для хранения миграций, но инструмент EF необходимо вызывать для проекта с фактическим подключением.

EF Core использует внедрение зависимостей для настройки служб для среды выполнения, включая настройку строки подключения для любой БД. Контроль над тем, как классы БД взаимодействуют со своей средой, предоставляется приложению, которое его запускает, что позволяет использовать один и тот же код БД в нескольких экземплярах, состояниях и даже провайдерах. EF Core использует текущее состояние и поставщика базы данных, в которой он развернут, для определения изменений и формирования шаблонов, поэтому он может создавать миграции только с настроенным экземпляром DbContext, подключенным к базе данных (обычно это экземпляр разработки).

Если решение состоит из нескольких зависимых служб с общей моделью данных, которым потребуются одни и те же миграции, только один из проектов в решении должен отвечать за управление состоянием БД. Какой бы проект ни был выбран, он должен создать DBContext с допустимым соединением при запуске, чтобы инструменты EF работали. ASP.NET Core использует пакет Microsoft.Extensions.Configuration и метод UseStartup для упрощения настройки. Это может быть ваш существующий проект пользовательского интерфейса, который будет считывать строку подключения из существующих настроек и передавать ее в ваш CustomDbContext при запуске. Интерфейс командной строки EF Tools будет использовать профиль по умолчанию (зеленая стрелка запуска), чтобы получить настройки от launchSettings.json и appSettings.json для подключения к базе данных. Конфигурация должна присутствовать в каждой среде, в которой выполняется развертывание, чтобы миграции можно было запускать из одного и того же проекта настройки и применять по мере необходимости.

Вы можете отказаться от ASP.NET и создать пользовательский класс запуска в вашем пакете данных, который запускается для применения миграций, но это требует много дополнительной работы для того, что уже есть в коробке. В классе DbContext есть метод OnConfiguring, который можно использовать для установки соединения. Размещение конфигурации внутри ограничений кода, в которых может работать программное обеспечение, поэтому оно все равно должно быть устанавливается извне.

На DbContext можно ссылаться из другого пакета:

DbContext и модели могут быть определены в отдельном «чистом» проекте, а затем указаны в Startup следующим образом:

    using mysolution.Data.CustomDbContext;
...
     services.AddDbContext<CustomDbContext>(options =>
                    options.UseSqlServer(
                        Configuration.GetConnectionString("defaultConnection")));

Настройте запуск DbContext и место для хранения миграций:

Сложность заключается в применении миграций, если вы их используете. Если ваша сборка Razor называлась 'mysolution_UI', а проект данных — 'mysolution_Data'. Переместите Data, Models, Migrations в mysolution_Data и добавьте это в запуск в проекте mysolution_UI:

    services.AddDbContext<CustomDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("defaultConnection")
            , b => b.MigrationsAssembly("mysolution_Data")));

Затем при добавлении или развертывании пакета миграцию следует вызывать из проекта 'mysolution_UI'.

   Add-Migration NewMigration -Project mysolution_UI

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

person Matt E.    schedule 11.06.2021
comment
Я бы хотел, чтобы миграции были в моей библиотеке классов. Вот почему я не уверен, как моя библиотека классов знает, как найти настройки в моем основном приложении при выполнении миграции и обновлении базы данных. - person Jonathan Wood; 11.06.2021
comment
@JonathanWood, как вы выполняете миграции? - person Guru Stron; 11.06.2021
comment
@JonathanWood вам все равно нужно будет установить строку подключения в том же проекте, что и класс Startup. Миграции можно хранить в пакете данных, но их необходимо применять из пакета конфигурации. Это связано с тем, что он не знает, в какой БД он находится, пока он не будет запущен вызывающим проектом. - person Matt E.; 11.06.2021
comment
@Гуру: add-migration - person Jonathan Wood; 11.06.2021
comment
@JonathanWood, вы пытались сделать это после перемещения контекста и миграции в отдельную сборку? :) - person Guru Stron; 11.06.2021
comment
@MattE.: Я не уверен, к чему относится пакет настройки, но можете ли вы объяснить, как запущенные команды в консоли диспетчера пакетов в проекте классов данных получают информацию из основного приложения? Я не запускаю основное приложение. Как он узнает строку подключения и т. д.? - person Jonathan Wood; 12.06.2021
comment
@JonathanWood отредактировал для большего контекста - без каламбура. «Пакет настройки» — это проект, который создает DbContext во время выполнения, EF нужен для создания миграций. Поскольку пользовательский интерфейс развертывается с этой зависимостью, он может взять на себя ответственность за ее выполнение. Этот документ может помочь: docs.microsoft .com/en-us/ef/core/managing-schemas/migrations/ - person Matt E.; 14.06.2021
comment
@MattE.: Спасибо. У меня возникли проблемы с некоторыми вашими объяснениями. Но для меня, если я перемещу всю свою папку Data в библиотеку классов, установлю проект по умолчанию в консоли диспетчера пакетов в мою библиотеку классов, а также вызову SqlServerDbContextOptionsBuilder.MigrationsAssembly() при запуске моего основного приложения с именем моя библиотека классов, кажется, работает. Я почти уверен, что последний шаг не требуется. Кажется, вы объясняете дополнительные шаги, с которыми у меня возникли проблемы. Я не знаю, пропустил ли я что-нибудь. Но я определенно не понимаю, как он знает, что такое строка подключения. - person Jonathan Wood; 15.06.2021