Почему мой код Entity Framework сначала DbContext не отображает сущности из моей заполненной таблицы?
-
27-10-2019 - |
Вопрос
Я пытаюсь развернуть свое приложение в тестовой среде, но не могу заставить Entity Framework нормально работать с базой данных. В процессе разработки я использую инициализатор базы данных для заполнения базы данных, и это работало безупречно. Однако когда я развертываю приложение на реальном экземпляре IIS, я не могу заставить его взаимодействовать с базой данных. Мои собственные правила инициализации вообще не выполняются, поэтому я создаю базу данных вручную.
Я использовал ObjectContext.CreateDatabaseScript () в качестве отправной точки для моего сценария SQL, а SSMS проверяет, заполнены ли две строки в соответствующей таблице.
Моя проблема возникает после запуска приложения. У меня есть собственные поставщики членства и ролей, ни один из которых, похоже, не обнаруживает, что эти две роли существуют в базе данных.
Как заставить мою структуру сущностей распознавать, что эти строки не пустые? В настоящее время я использую частный DbContext внутри репозитория для обработки связи с Entity Framework и отключил свой собственный инициализатор, пока этот сбой не будет устранен.
Код, который пытается найти роли в базе данных:
родовое словоБаза данных показывает в таблице ролей следующее:
родовое словоLINQ генерирует исключение пустой последовательности, поскольку context.Roles пуст.
Решение 2
Вот шаги, которые я предпринял для перехода от проекта с первым кодом к пользовательской реализации IDatabaseInitializer, которая сбрасывает базу данных во время каждого сеанса на энергонезависимую настройку БД.
Сначала скопируйте схему, сгенерированную Entity Framework, в свой dev. проект, запустив следующий код и поместив выходные данные в доступное место (например, файл на рабочем столе, необработанный текст в браузере и т. д.). context - это экземпляр вашего класса, который наследуется от DbContext :
родовое словоВо-вторых, сохраните строку, полученную в результате этого вызова, в файле SQL. Обязательно удалите команду, которая создает таблицу метаданных Entity Framework. Эта команда должна выглядеть следующим образом:
родовое словоЗатем удалите код, заполняющий базу данных. Я использовал AppSetting, чтобы я мог легко переключать использование этого кода после развертывания без необходимости повторной компиляции и развертывания.
родовое словоСразу за пределами этого оператора вам все равно нужно инициализировать базу данных, но убедитесь, что вы передали false , чтобы инициализация происходила только в том случае, если база данных не была инициализирована.
родовое словоНаконец, запустите свой установочный SQL в пустой базе данных, чтобы таблицы были созданы с соответствующими полями.
Если вы развернете, а затем запустите свое приложение, оно должно подключиться к базе данных и иметь возможность работать в обычном режиме с любыми данными, загруженными во внешний скрипт. Я успешно протестировал этот метод с настраиваемыми поставщиками членства и ролей.
Другие советы
Судя по комментариям, связи между Entity Framework и базой данных нет.Вы не указываете, какую версию Entity Framework вы используете, но я предполагаю, что вы обновили до последней версии (4.3 на момент написания).
Я заметил, что вы говорите, что «создаете базу данных вручную».Почему бы не открыть тестовый проект и не создать первую модель новой базы данных на основе созданной вручную базы данных?Это должно как минимум подтвердить, что вы можете использовать Entity Framework со своей конфигурацией. Оттуда я бы создал еще один проект с нуля, чтобы протестировать подход Code First.