实体框架无法在集成测试中切换连接

时间:2015-06-28 14:27:50

标签: c# entity-framework entity-framework-6 integration-testing

我有一个正常的项目,在app.config中很好地配置了连接。我有一个测试项目,连接也很好地配置。一切都很完美。

但是当我想在代码中切换连接时,似乎没有任何工作。它似乎完全忽略了我在构造函数中传递的连接字符串,并且它继续使用默认连接(由配置指定的匹配db上下文的类名。

我在测试项目中的配置:

<!-- Connection string  -->
<connectionStrings>
    <add name="MyApplication.Database.MyContext" connectionString="Data Source=(LocalDb)\v11.0;AttachDBFilename=C:\DB\Test1.mdf" providerName="System.Data.SqlClient" />
    <add name="TestEntities" connectionString="Data Source=(LocalDb)\v11.0;AttachDBFilename=C:\DB\Test2.mdf" providerName="System.Data.SqlClient" /> 
</connectionStrings>

我的(仍然)小测试:

using (var db = new MyContext(@"name=TestEntities"))
{
    db.Database.Initialize(true);
}

这样做是在C:\ DB \ Test1.mdf而不是C:\ DB \ Test2.mdf创建一个新数据库。这很奇怪,因为如果删除连接字符串,我会收到一个无法找到的错误。如果我调试测试,我甚至可以在连接对象中看到正确的连接字符串。

我不知道我在这里做错了什么。

什么有效(但有点奇怪/丑陋),是我的DatabaseContext的子类,所以它得到一个新的名字。

P.S。这是我的整个app.config文件(在测试项目中):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>


  <!-- Connection string  -->
  <connectionStrings>
    <add name="MyApplication.Database.MyContext" connectionString="Data Source=(LocalDb)\v11.0;AttachDBFilename=C:\DB\Test1.mdf" providerName="System.Data.SqlClient" />
    <add name="TestEntities" connectionString="Data Source=(LocalDb)\v11.0;AttachDBFilename=C:\DB\Test2.mdf" providerName="System.Data.SqlClient" /> 
  </connectionStrings>

</configuration>

2 个答案:

答案 0 :(得分:1)

在整个app.config中。 TestEntities连接字符串不存在。检查&#39; + TestEntities&#39;在配置

编辑:

此外,如果上下文类名称具有在配置中定义的具有相同名称的连接字符串 - 这将优先。手动连接字符串定义将被忽略。

请使用现有的连接字符串搜索&#39;在此链接中:https://books.google.co.za/books?id=X63NBgAAQBAJ&pg=PA157&lpg=PA157&dq=entity+framework+connection+string+precedence&source=bl&ots=ZjPMWaidLV&sig=zmo40T5myWllmNzlVI8rS25-tXo&hl=en&sa=X&ei=RkCQVfjuJ-OP7AbuoKu4CQ&ved=0CCsQ6AEwBQ#v=onepage&q=entity%20framework%20connection%20string%20precedence&f=false

答案 1 :(得分:0)

没有更多的代码,我只能猜测,但我怀疑你错过了对基类构造函数的调用。它应该是这样的:

public class MyContext : DbContext
{
    public MyContext(string connectionString) : base(connectionString) { }
}