我正在处理一个. NET 4.5.2项目,该项目在每次运行集成测试时都会从.mdf
文件创建一个In-Memory数据库。
DB在大多数情况下都能很好地工作,但是有时候,当我们对表的模式进行更改,或者添加/删除一个表时,我们会遇到如下问题:
Message:
OneTimeSetUp: System.Data.SqlClient.SqlException : There is already an object named 'SomeTable' in the database
我们已经将其缩小到这样一个事实:当我们想要在合并(known issue)后更新测试数据库模式时,EF迁移会变得一团糟。似乎每次我们遇到这些问题之一时,都会添加一个空迁移来解决问题,然而,这种解决方法非常俗气。
我的问题是:* * 是否有办法防止此类问题?是否有更干净的解决方案?**
对于一些额外的内容,我将描述我们是如何做事情的(也许我们在某种程度上搞砸了):
我们有一个Db.mdf
文件,它在运行任何测试之前由LocalDbHelper
加载:
使用此代码:
public static void PrepareEmptyDb()
{
var migrationConfiguration = new Configuration()
{
AutomaticMigrationsEnabled = true,
AutomaticMigrationDataLossAllowed = true
};
var migrator = new DbMigrator(migrationConfiguration);
migrator.Update();
}
此代码应在OneTimeSetup
中的IntegrationTestBase
类中运行。
这是Configuration
类中的代码(这是我们的第一个代码Persistance
项目,所有迁移都驻留在这里):
internal sealed class Configuration : DbMigrationsConfiguration<Context.DbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Context.DbContext context)
{
context.Settings.AddOrUpdate(
p => p.Name,
new Setting { Name = SettingNames.RoundingDirection, Value = "Up" },
new Setting { Name = SettingNames.RoundingValue, Value = "10" },
new Setting { Name = SettingNames.RateCacheLifetimeMinutes, Value = "30" });
}
}
任何帮助都将不胜感激,因为这个问题已经困扰我们一段时间了。
- 编辑:**我发现this link似乎表明,对于较旧版本的. NET,此解决方案是Microsoft自己建议的修复方法,但如果有人有更好的方法来修复它(或使其自动化),将非常感谢。
1条答案
按热度按时间9gm1akwq1#
添加一个空迁移似乎是解决这个问题的唯一方法。可悲的是,除了升级到Core之外,没有其他变通办法或修复方法。