Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Как определить в Entity Framework, что модель не соответствует подключенной базе данных

#entity_framework


Создал модель на основе базы данных. На сервере имеются несколько идентичных ей.
Пользователь имеет возможность выбора к какой базе подключиться. Но в тоже время возникает
проблема, что пользователь выберет иную БД, в которой отсутствуют требуемые таблицы
и возникнет ошибка.
Как можно определить присутствуют ли в выбранной БД требуемые таблицы? Есть ли в
Entity Framework для этого средства?

Использовал Database First
    


Ответы

Ответ 1



Если CodeFirst: bool isCompatible = db.Database.CompatibleWithModel(true); true - модель и бд идентичны, false - модель и бд не идентичны.

Ответ 2



Таких встроенных средств в EF не нашел. Но мой вариант решения такой Включаем для БД контекста возможность миграций. Для этого вводим команду enable-migrations из Tools → Library Package Manager → Package Manager Console После выполнения команды в выбранном проекте должна создаться папка Migrations, а внутри этой папки файл Configuration.cs, который содержит настройки миграции. В конструкторе этого автоматически сгенерированного класса отключаем автоматическую миграцию, установив свойству AutomaticMigrationsEnabled значение false. Например, internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(ContosoUniversity.DAL.SchoolContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // } } Теперь, при инициализации контекста БД, если схема БД не подходит описанной модели, то будет кидаться исключение(без попытки подстроить схему БД под модель). Выполняем явную инициализацию контекста, завернув его в try/catch try { using(var context = new MyDb()) { context.Database.Initialize(false); } // БД подходит под модель } catch { // бд не соответствует схеме } Этот код можно завернуть в некий метод, возвращающий булево значение с результатом проверки соответствия модели и схемы БД. Если возникло исключение, то значит схема БД не соответствует модели. Также можно выполнить sql-скрипт для проверки существования в базе таблицы с помощью БД контекста: using(var dbContext = new MyDb()) { int result = (dbContext as IObjectContextAdapter).ObjectContext.ExecuteStoreQuery(@" IF EXISTS (SELECT * FROM sys.tables WHERE name = 'TableName') SELECT 1 ELSE SELECT 0 ").SingleOrDefault(); }

Комментариев нет:

Отправить комментарий