Entity Framework 4.1 «Code First» SetInitializer больше не вызывается после Database.Delete - PullRequest
6 голосов
/ 31 марта 2011

Сначала пытаемся выполнить какое-то модульное тестирование с кодом EF 4.1. У меня есть моя живая БД (SQL Server) и моя БД модульного тестирования (Sql CE). После борьбы (и проигрыша) с EF, Sql CE 4.0 и поддержкой транзакций я решил, что самый простой способ запустить мой тест:

  1. Создать Db
  2. Выполнить тест
  3. Удалить Db
  4. Прополоскать и повторить

У меня есть функции [Setup] и [TearDown]:

[SetUp]
public void Init()
{
    System.Data.Entity.Database.SetInitializer(new MyTestContextInitializer());
    _dbContext = ContainerFactory.Container.GetInstance<IContext>();
    _testConnection = _dbContext.ConnectionString;
}

[TearDown]
public void Cleanup()
{
    _dbContext.Dispose();
    System.Data.Entity.Database.Delete(_testConnection);
}

Проблема в том, что System.Data.Entity.Database.SetInitializer не вызывает MyTestContextInitializer после первого теста.

Следовательно, второй тест завершается неудачно с:

System.Data.EntityException: базовый поставщик не удалось открыть.
----> System.Data.SqlServerCe.SqlCeException : Файл базы данных не найден. Проверьте путь к базе данных

TIA для любых указателей

Ответы [ 3 ]

7 голосов
/ 01 апреля 2011

Я справился с этим, вызвав 'InitializeDatabase' вручную.Вот так:

   [SetUp]
    public void Init()
    {

        var initializer = new MyTestContextInitializer();
        System.Data.Entity.Database.SetInitializer(initializer);

        _dbContext = ContainerFactory.Container.GetInstance<IContext>();
        initializer.InitializeDatabase((MyTestContext)_dbContext);

        _testConnection = _dbContext.ConnectionString;
    }

    [TearDown]
    public void Cleanup()
    {
        System.Data.Entity.Database.Delete(_testConnection);

        _dbContext.Dispose();
    }

Я думаю, что это может быть ошибка в EF 4.1 RC.

2 голосов
/ 16 ноября 2011

Это не ошибка, инициализатор установлен с

System.Data.Entity.Database.SetInitializer

вызывается только при первом создании контекста в AppDomain. Следовательно, поскольку все ваши тесты выполняются в одном домене приложений, он вызывается только при запуске первого теста.

1 голос
/ 15 августа 2012

Мне потребовался почти день, чтобы выяснить причину моего странного поведения юнит-теста: соединение с базой данных оставалось открытым или база данных не создавалась при каждом новом тесте.Я всюду искал корень причины: MSTest (без прав администратора или где рабочие копии файлов каким-то образом удалены?), SQL Server Express / CE (сбой входа в систему?), Unity (объекты не расположены?) Или Entity Framework (не правильноинициализация базы данных?).Оказалось, это EF.Большое спасибо за ответ!

...