当我从基于代码的配置的ASP MVC项目运行代码时,为什么我的EF 6.1中的连接字符串发生了变化?

时间:2014-05-20 02:11:30

标签: asp.net-mvc entity-framework asp.net-web-api connection-string entity-framework-6

我有一个包含EF相关代码的dll:实体,上下文和基于代码的配置。当我在这个dll上运行测试时,一切正常。

我创建了一个ASP MVC Web Api项目,当我从中调用dll时,我得到以下异常:

“无法将文件'C:\ project \ xxx \ MyProj.Persistance.IndicatorsContext.mdf'附加为数据库MyProj.Persistance.IndicatorsContext'”

我正在使用基于代码的配置:

 public class MyDbConfiguration : DbConfiguration
 {
    public MyDbConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
        SetDefaultConnectionFactory(new LocalDbConnectionFactory("v11.0"));

    }
} 

这是我的背景:

[DbConfigurationType(typeof(MyDbConfiguration))] 
public class IndicatorsContext : DbContext
{
    public IndicatorsContext()            
    {
        Debug.Write("Connection String:" + Database.Connection.ConnectionString);
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<IndicatorsContext>());            
    }
    // etc...
    }
}

有趣的是,当我在Context构造函数中查看连接字符串时,它会有所不同,这取决于我是运行测试还是运行Asp Mvc。我注意到两个连接字符串不同:

  1. 数据源=(localdb)\ v11.0;初始目录= MyProj.Persistance.IndicatorsContext; Integrated Security = True; MultipleActiveResultSets = True
  2. 数据源=(localdb)\ v11.0; AttachDbFilename = | DataDirectory | MyProj.Persistance.IndicatorsContext.mdf;初始目录= MyProj.Persistance.IndicatorsContext; Integrated Security = True; MultipleActiveResultSets = True
  3. 第二个是来自Asp Mvc并且有AttachDbFilename部分?

    我在Web.config中注释掉了entityFramework标记,只留下以下内容:

    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    

    如何让MVC项目使用我从测试中运行项目时获得的相同连接字符串?

1 个答案:

答案 0 :(得分:1)

您没有指定要在任何地方使用的连接字符串,因此实体框架会为您创建它。

请参阅http://msdn.microsoft.com/en-us/data/jj592674具体的部分:

  

使用Code First按惯例连接

     

如果您的应用程序中没有进行任何其他配置,那么   在DbContext上调用无参数构造函数会导致   DbContext以Code First模式运行并创建数据库连接   按惯例。

因此推断出连接字符串是按惯例创建的,只需要弄清楚那个约定是什么

来自:http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Infrastructure/LocalDbConnectionFactory.cs相关部分是:

    /// <summary>
    /// Creates a connection for SQL Server LocalDb based on the given database name or connection string.
    /// If the given string contains an '=' character then it is treated as a full connection string,
    /// otherwise it is treated as a database name only.
    /// </summary>
    /// <param name="nameOrConnectionString"> The database name or connection string. </param>
    /// <returns> An initialized DbConnection. </returns>
    public DbConnection CreateConnection(string nameOrConnectionString)
    {
        Check.NotEmpty(nameOrConnectionString, "nameOrConnectionString");

        var attachDb = string.IsNullOrEmpty(AppDomain.CurrentDomain.GetData("DataDirectory") as string)
                           ? " "
                           : string.Format(
                               CultureInfo.InvariantCulture, @" AttachDbFilename=|DataDirectory|{0}.mdf; ", nameOrConnectionString);

        return new SqlConnectionFactory(
            string.Format(
                CultureInfo.InvariantCulture,
                @"Data Source=(localdb)\{1};{0};{2}",
                _baseConnectionString,
                _localDbVersion,
                attachDb)).CreateConnection(nameOrConnectionString);
    }

如您所见,AppDomain.CurrentDomain.GetData(“DataDirectory”)是您获取AttachDbFilename部分的原因

回答你的问题:如何让MVC项目使用我从测试中运行项目时获得的相同连接字符串?

明确你想要的连接字符串是什么..请参考我发布的第一个链接,并选择你想要设置的那个(例如在web.config中,在构造函数中等)

OR

确保您的app域在执行时的设置方式与运行WebApi项目时的设置方式相同,例如

AppDomain.CurrentDomain.SetData("DataDirectory", path);