Почему мой код Entity Framework сначала DbContext не показывает сущности из моей заполненной таблицы? - PullRequest
4 голосов
/ 17 февраля 2012

Я пытаюсь развернуть свое приложение в среде тестирования, но не могу заставить Entity Framework хорошо работать с базой данных.В разработке я использую инициализатор базы данных для заполнения базы данных, и это сработало безупречно.Однако при развертывании приложения на фактическом экземпляре IIS я не могу заставить его взаимодействовать с базой данных.Мои пользовательские правила инициализации вообще не запускаются, поэтому я вместо этого создаю базу данных вручную.

Я использовал ObjectContext.CreateDatabaseScript () в качестве отправной точки для моего сценария SQL, и SSMS проверяет, что две строкизаполнено в соответствующей таблице.

Моя проблема возникает после запуска приложения.У меня есть пользовательские поставщики членства и ролей, ни одна из которых, похоже, не обнаруживает наличие двух ролей в базе данных.

Как мне заставить мою платформу сущностей распознать, что эти строки не пусты?В настоящее время я использую закрытый DbContext внутри репозитория для обработки связи с Entity Framework и отключил мой пользовательский инициализатор до устранения этой ошибки.

Код, который пытается найти роли в базе данных:

context.Roles.Single(r => r.Name == role)

База данных показывает следующее в таблице ролей:

Id  Name     Description
1   Company  NULL
2   Customer NULL

LINQ генерирует исключение пустой последовательности, так как context.Roles пусто.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2012

Вот шаги, которые я прошел, чтобы перейти от проекта кода сначала с пользовательской реализацией IDatabaseInitializer, которая сбрасывает базу данных во время каждого сеанса в энергонезависимую установку БД.

Сначала скопируйте схему, сгенерированную Entity Framework, в свой dev. спроектировать, запустив следующий код и разместив вывод в доступном месте (например: файл на рабочем столе, необработанный текст в браузере и т. д.). context - это экземпляр вашего класса, который наследуется от DbContext :

((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()

Во-вторых, сохраните строку, возвращенную из этого вызова, в файл SQL. Обязательно удалите команду, которая создает таблицу метаданных Entity Framework. Эта команда должна выглядеть следующим образом:

create table [dbo].[EdmMetadata] 
( 
    [Id] [int] not null identity, 
    [ModelHash] [nvarchar](max) null, 
    primary key ([Id]) 
);

Затем удалите код, который заполняет базу данных. Я использовал AppSetting, чтобы я мог легко переключать использование этого кода после развертывания без необходимости повторной компиляции и развертывания.

if (ConfigurationManager.AppSettings["Mode"] == "Dev")
{
    Database.SetInitializer<PonosContext>(new PonosInitializer());
    new MyContext().Database.Initialize(true);
}

Непосредственно за пределами этого оператора вам все еще нужно инициализировать базу данных, но обязательно передать false , чтобы инициализация происходила только в том случае, если база данных не была инициализирована.

new MyContext().Database.Initialize(false);

Наконец, запустите ваш установочный SQL в пустой базе данных, чтобы таблицы были созданы с соответствующими полями.

Если вы развернете, а затем запустите свое приложение, оно должно подключиться к базе данных и иметь возможность работать в обычном режиме с любыми данными, загруженными во внешний скрипт. Я успешно проверил этот метод с пользовательскими членами и поставщиками ролей.

0 голосов
/ 17 февраля 2012

Судя по комментариям, похоже, что нет никакой связи между Entity Framework и базой данных. Вы не упоминаете, какую версию Entity Framework вы используете, но я предполагаю, что вы обновились до последней версии (4.3 на момент написания).

Я заметил, что вы говорите, что "создаете базу данных вручную". Почему бы не открыть тестовый проект и создать новую модель первой базы данных на основе созданной вручную базы данных? Это должно как минимум подтвердить, что вы можете использовать Entity Framework с вашей конфигурацией. Оттуда я бы создал новый проект с нуля, чтобы протестировать подход Code First.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...