Как я могу создать базу данных на лету с. NET Core EF - PullRequest
0 голосов
/ 22 апреля 2020

У меня проблема с dotnet ef. Я пытаюсь создать новую базу данных для каждого обнаруженного субдомена. Я узнал, что могу использовать _context.Database.Migrate() здесь, но кажется, что это возможно только в классах Startup & Program.

Как я могу сделать это, когда программа уже запущена? Так как я могу получить поддомен только тогда, когда приложение работает

Вот что я попробовал:

// Db Context
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{
     // _ecosystemServices.GetSubdomain gets the domain
     var subdomain = _ecosystemServices.GetSubDomain(_accessor);

     // _ecosystemServices.GetConnectionString returns the appropriate connection  string based on the subdomain
     optionsBuilder.UseSqlServer(_ecosystemServices.GetConnectionString(subdomain));         

     // Attempting to create the database
     _context.Database.Migrate();
}

Но это не работает, и я получаю ошибку циклической зависимости. Что мне делать?

Заранее спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

С EF Core вы можете использовать один из

context.Database.Migrate()

или

context.Database.EnsureCreated(),

, где context - DbContext.

Где вы звоните любой из это зависит от логики c вашего приложения, но в OnConfiguring() это определенно не то место , поскольку, когда необходимо создать базу данных, EF сначала создает модель и, следовательно, вызывает OnConfiguring(). Следовательно, вы должны получить сообщение о переполнении стека.

Что касается циклической зависимости, я не могу сказать, но либо компилятор C# слишком умен и переводит возможное переполнение стека в циклическую зависимость (в чем я, честно говоря, сомневаюсь), либо источник ошибка приходит откуда-то еще.

Однако вы должны знать о различиях между Migrate() и EnsureCreatd(). Второй не применяет миграции в вашем коде. Вот ответ Роуэн Миллер на похожий вопрос об обоих методах в Github :

Вы бы либо вызвали EnsureCreated (), либо Migrate ( ). EnsureCreated () - это альтернатива, которая полностью пропускает конвейер миграции и просто создает базу данных, соответствующую вашей текущей модели. Это хорошо для модульного тестирования или очень раннего создания прототипов, когда вы просто хотите удалить и заново создать базу данных при изменении модели.

Вы можете просто заменить весь свой код на db. Database.Migrate ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...