Search code examples
entity-frameworknunitsql-server-ce-4

Entity Framework 4.1 "Code First" SetInitializer not being called again after Database.Delete


Trying to do some unit testing with EF 4.1 code first. I have my live db (SQL Server) and my unit test DB( Sql CE). After fighting (and losing) with EF, Sql CE 4.0 and Transaction support I decided the simplest way to run my test was to:

  1. Create Db
  2. Run Test
  3. Delete Db
  4. Rinse and repeat

I have my [Setup] and [TearDown] functions:

[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);
}

Issue is that System.Data.Entity.Database.SetInitializer does not call MyTestContextInitializer after the first test.

Hence the 2nd test then fails with:

System.Data.EntityException : The underlying provider failed on Open.
----> System.Data.SqlServerCe.SqlCeException : The database file cannot be found. Check the path to the database

TIA for any pointers


Solution

  • I got around this by calling 'InitializeDatabase' manually. Like so:

       [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();
        }
    

    I think it may be a bug with EF 4.1 RC.