Ситуация
Я хочу включить модульное тестирование моего DbContext
на основе Entity Framework 6. Я создал свою DbContext
и свои модели с первым подходом к базе данных, и теперь у меня есть файл конструктора .edmx.
Эта проблема
Мой автоматически созданный DbContext
переопределяет DbContext.OnModelCreating
а> такой метод:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
Я пытаюсь создать новый экземпляр моего DbContext
в моей ложной службе доступа к данным на основе информации этой статьи. Мой код не сталкивается с Database.SetInitializer;
, как указал автор этого сообщения в блоге. Мой конструктор выглядит точно так же, как его. Моя инициализация DbContext
выглядит так:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
Что приводит к следующему исключению при достижении ранее упомянутого переопределенного OnModelCreating
System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 'Контекст используется в режиме Code First с кодом, созданным из файла EDMX для разработки Database First или Model First. Это не будет работать правильно. Чтобы устранить эту проблему, не удаляйте строку кода, вызывающую это исключение. Если вы хотите использовать Database First или Model First, убедитесь, что строка подключения Entity Framework включена в app.config или web.config запускаемого проекта. Если вы создаете свой собственный DbConnection, убедитесь, что это EntityConnection, а не какой-либо другой тип DbConnection, и что вы передаете его одному из базовых конструкторов DbContext, которые принимают DbConnection. Чтобы узнать больше о Code First, Database First и Model First, см. документацию по Entity Framework здесь: http://go.microsoft.com/fwlink/?LinkId=394715'
Есть много вопросов о stackoverflow, которые сосредоточены на модульном тестировании с усилием при использовании подхода, ориентированного на базу данных, но, похоже, ни у кого нет таких проблем, как у меня.
Что я уже пытался сделать
- Долго искал решение в интернете.
- Раскомментируйте переопределенный
OnModelCreating()
. - Я уже безуспешно пытался применить это решение.
- Смоделируйте мой
DbContext
с помощью Moq, что определенно не вариант.
Вопрос
Как я могу создать и использовать базу данных в памяти (с усилием)?
Дополнительная информация
Когда я раскомментирую OnModelCreating()
, при первом доступе к DataContext будет выдано исключение. Например.:
DbConnection effortConnection = Effort.DbConnectionFactory.CreatePersistent("MockedDatabaseEntities");
using (DatabaseEntities dataContext = new DatabaseEntities(effortConnection))
{
dataContext.Students.Count(); // Exception throws here
}
System.Data.Entity.ModelConfiguration.ModelValidationException: 'Во время создания модели обнаружена одна или несколько ошибок проверки: MyApplication.Shared.Model.KeyValuePair: : EntityType 'KeyValuePair' не имеет определенного ключа. Определите ключ для этого EntityType. KeyValuePairs: EntityType: EntitySet «KeyValuePairs» основан на типе «KeyValuePair», для которого не определены ключи.
uniqueidentifier
, как во всех других таблицах. Его типnchar(50)
- person WΩLLE - ˈvɔlə   schedule 12.09.2017