实体框架4.1“代码优先";“代码优先".在Database.Delete之后不会再次调用SetInitializer [英] Entity Framework 4.1 "Code First" SetInitializer not being called again after Database.Delete

查看:83
本文介绍了实体框架4.1“代码优先";“代码优先".在Database.Delete之后不会再次调用SetInitializer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先尝试使用EF 4.1代码进行一些单元测试.我有实时数据库(SQL Server)和单元测试数据库(Sql CE).在与EF,Sql CE 4.0和事务支持战斗(失败)之后,我决定运行测试的最简单方法是:

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. 创建Db
  2. 运行测试
  3. 删除Db
  4. 冲洗并重复

我有[设置]和[TearDown]函数:

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

问题是System.Data.Entity.Database.SetInitializer在第一次测试后没有调用MyTestContextInitializer.

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: 基础提供程序在Open上失败.
----> System.Data.SqlServerCe.SqlCeException :找不到数据库文件. 检查数据库路径

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

推荐答案

我通过手动调用'InitializeDatabase'解决了这个问题.像这样:

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

我认为这可能是EF 4.1 RC的错误.

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

这篇关于实体框架4.1“代码优先";“代码优先".在Database.Delete之后不会再次调用SetInitializer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆