Почему мой код Entity Framework сначала DbContext не отображает сущности из моей заполненной таблицы?

StackOverflow https://stackoverflow.com/questions/9332346

Вопрос

Я пытаюсь развернуть свое приложение в тестовой среде, но не могу заставить 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top