我有一个包含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。我注意到两个连接字符串不同:
第二个是来自Asp Mvc并且有AttachDbFilename部分?
我在Web.config中注释掉了entityFramework标记,只留下以下内容:
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
如何让MVC项目使用我从测试中运行项目时获得的相同连接字符串?
答案 0 :(得分:1)
您没有指定要在任何地方使用的连接字符串,因此实体框架会为您创建它。
请参阅http://msdn.microsoft.com/en-us/data/jj592674具体的部分:
使用Code First按惯例连接
如果您的应用程序中没有进行任何其他配置,那么 在DbContext上调用无参数构造函数会导致 DbContext以Code First模式运行并创建数据库连接 按惯例。
因此推断出连接字符串是按惯例创建的,只需要弄清楚那个约定是什么
/// <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);