#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(); }
Комментариев нет:
Отправить комментарий