如何设置的LocalDB在Visual Studio 2012和Entity Framework 5

2019-06-27 17:25发布

我们使用实体框架5的Visual Studio 2012的ASP.NET MVC项目。

有迹象表明,依赖于数据库的一些单元测试。 在测试项目设置app.config文件使用一个中央SQL Server数据库正常工作。

然而,这将是好得多使用的LocalDB,让每个开发人员运行测试时都有他/她自己的数据库。 特别是因为我们希望有设立测试DropCreateDatabaseAlways运行时。

但是,我不能让安装工作。 如果我尝试这的app.config:

<add name="TestDb" 
   connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=unittestdb;
     Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\unittestdb.mdf"
   providerName="System.Data.SqlClient" />

我得到:

System.Data.SqlClient.SqlException:发生文件激活错误。 物理文件名“\ unittestdb.mdf”可能不正确。 诊断和纠正其他错误,然后重试操作。 CREATE DATABASE失败。 列出的某些文件名不能创建。 检查相关的错误。

这听起来像它想要的MDF文件已经存在,因为它试图创建数据库,这似乎很奇怪。 手动创建一个MDF文件不改变错误消息。

Answer 1:

尝试:

AppDomain.CurrentDomain.SetData(
  "DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));

这将创建在/bin/Debug/yourdbname.mdf数据库文件



Answer 2:

我会用:

// Declare this property - this is set by MSTest
public TestContext TestContext { get; set; }

// In test initialization - note the signature should be exactly this
// A static void method with one argument of type TestContext 
[ClassInitialize]
public static void SetUp(TestContext context)
{
   AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(context.TestDeploymentDir, string.Empty));
}

可能会导致你的问题AppDomain.CurrentDomain.BaseDirectory ,改用: context.TestDeploymentDir



Answer 3:

请记住,对于测试项目:

AttachDBFilename=|DataDirectory|

意味着它会看着你的输出/斌/ debug文件夹中的一个单元测试在你的web /生产/任何应用反对App_Data文件夹。

你需要做两件事情1.将App_Data文件夹中的数据库文件输出到您的测试应用的根。 2.突出显示您的数据库,以便您在Visual Studio中得到你的属性窗口。 设置构建行动“内容”,所以当你运行该项目,它会被复制到输出文件夹。

瞧。



Answer 4:

我建议使用此代码(基于的答案Jupaol ):

[ClassInitialize]
public static void SetUp(TestContext context)
{
    AppDomain.CurrentDomain.SetData(
        "DataDirectory", 
        context.TestDeploymentDir);
}

通常这将里面创建数据库TestResults\<test run>\Out\您的解决方案的文件夹中。



Answer 5:

我发现你的问题,同时寻找解决问题的办法。 在一个单独的项目中使用与NUnit的的EntityFramework,我不得不改变的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> </configuration> 



文章来源: How to set up LocalDb for unit tests in Visual Studio 2012 and Entity Framework 5