.net 测试数据库上的EF迁移在合并后中断所有集成测试

oipij1gg  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(114)

我正在处理一个. 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自己建议的修复方法,但如果有人有更好的方法来修复它(或使其自动化),将非常感谢。
9gm1akwq

9gm1akwq1#

添加一个空迁移似乎是解决这个问题的唯一方法。可悲的是,除了升级到Core之外,没有其他变通办法或修复方法。

相关问题