2

Я использую EF6 в проекте ASP.NET 5. Где я использую идентификатор ASP.NET как механизм аутентификации. Как и все, я смоделировал свои объекты домена в отдельном проекте dll и для логики доступа к данным у меня есть отдельный проект. Этот проект данных содержит миграции EF, DbContext для моделей доменов, репозиториев и Единицы работы.Автоматическое обновление базы данных с несколькими DbContexts

И у меня есть служебный уровень, с которым связаны контроллеры ASP.NET, и этот уровень сервиса будет связываться с уровнем данных и выполнять необходимые операции.

В основном веб-проекте ASP.NET у меня есть DbContext по умолчанию, который связан с Identity и его миграциями.

Наличие двух DbContexts каким-то образом препятствует автоматическому обновлению базы данных. Если у меня был только один DbContext после создания миграции для изменений модели, он будет автоматически запускаться в первый раз, когда я попытаюсь получить доступ к веб-сайту. Это больше не происходит, всегда мне нужно вручную запустить команду «update-database».

Одно из решений, которое я имею прямо сейчас, - добавить ссылку на «Microsoft.AspNet.Identity.EntityFramework» в моем проекте данных и использовать контекст Identity, содержащий мои таблицы домена. Но добавление ссылки ASP.NET в моем проекте данных - это то, что я не хочу делать, если у меня нет других параметров. Поскольку уровень данных даже не связан непосредственно с веб-уровнем.

Несмотря на то, что this видео Скотта Аллена обсуждают эту проблему, решение не предлагается.

+0

Привет, Geethanga, у меня есть те же проекты с вами, и у меня есть почти такая же проблема: я могу обновить две базы данных, если я переключаюсь между двумя проектами в консоли управления пакетами. Но если я опубликую проект до azure, миграция проекта dll завершилась, миграция в веб-проекте (который содержит идентификаторыContext) не имеет возможности запуска миграции. Можете ли вы подробнее рассказать о том, как вы используете DBMigrator для обновления базы данных? Спасибо – ChengWhyNot

ответ

1

Вы можете осуществлять курсовые разницы с помощью database initializer и использовать MigrateDatabaseToLatestVersion. Этот инициализатор позволяет явно указать контекст и конфигурацию, которые вы хотите использовать. Что-то вроде:

SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

Вы также можете вызвать всю логику вручную, эффективно делать то же самое, как Update-Database командлета, когда вы хотите во время запуска приложения. Посмотрите на DbMigrator class.

+0

Я решил обработать ситуацию с помощью DbMigrator с вызовом из Startup – Geethanga

1

Вы можете выполнить миграцию внутри каждого конструктора DbContext отдельно.

public class DataContext: DbContext 
{ 
    static DaraContext() 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>()); 
    } 
} 


public class ApplicationDbContext : IndetityDbContext 
{ 
    static ApplicationDbContext() 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>()); 
    } 
} 
+0

Я решил обработать ситуацию с помощью DbMigrator с вызовом Startup. Я не использую инициализаторы. – Geethanga

Смежные вопросы