.net core 如何测试我的模型是否已更改并需要迁移?

.net core 如何测试我的模型是否已更改并需要迁移?,.net-core,entity-framework-core,.net Core,Entity Framework Core,在开发一个dotnet应用程序时,我们会定期对模型进行更改,并且可能会让我们的单元测试运行一个在内存中动态创建的数据库 一切都可以正常工作,一切都很好,然后我们部署,突然一切都停止了,因为我们忘记了需要迁移数据库 如果模型已经更改,但没有针对该更改进行迁移,我如何编写一个将失败的单元测试?像这样 using MyProject.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Enti

在开发一个dotnet应用程序时,我们会定期对模型进行更改,并且可能会让我们的单元测试运行一个在内存中动态创建的数据库

一切都可以正常工作,一切都很好,然后我们部署,突然一切都停止了,因为我们忘记了需要迁移数据库

如果模型已经更改,但没有针对该更改进行迁移,我如何编写一个将失败的单元测试?

像这样

using MyProject.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Migrations.Design;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Xunit;

namespace MyProject.Tests.Migrations
{
    public class MissingMigrationsTest : MyProjectTestBase
    {
        /// <summary>
        /// Sometimes we change the model, but forget to create a migration for it (with dotnet ef migrations add)
        /// We do this test to detect a missing migration.
        /// </summary>
        /// <returns></returns>
        [Fact]
        public async Task ShouldCreateABlankMigration()
        {
            var db = new MyProjectDbContextFactory();

            // Create design-time services
            var serviceCollection = new ServiceCollection();
            serviceCollection.AddEntityFrameworkDesignTimeServices();
            serviceCollection.AddDbContextDesignTimeServices(db);
            var serviceProvider = serviceCollection.BuildServiceProvider();

            // Create a migration
            var migrationsScaffolder = serviceProvider.GetService<IMigrationsScaffolder>();
            Microsoft.EntityFrameworkCore.Migrations.Design.ScaffoldedMigration migration = migrationsScaffolder.ScaffoldMigration("test", "MyProject");

            var rs = Regex.Replace(migration.MigrationCode, @"\s+", string.Empty);
            //crude but, lets just remove all whitespace, and then check it has a blank Up() function
            rs.Contains("Up(MigrationBuildermigrationBuilder){}").ShouldBeTrue();
        }

    }
}
使用MyProject.EntityFrameworkCore;
使用Microsoft.EntityFrameworkCore.Design;
使用Microsoft.EntityFrameworkCore.Migrations.Design;
使用Microsoft.Extensions.DependencyInjection;
合理使用;
使用System.Text.RegularExpressions;
使用System.Threading.Tasks;
使用Xunit;
命名空间MyProject.Tests.Migrations
{
公共类MissingMigrationTest:MyProjectTestBase
{
/// 
///有时我们会更改模型,但忘记为其创建迁移(添加了dotnet ef migrations)
///我们执行此测试是为了检测丢失的迁移。
/// 
/// 
[事实]
公共异步任务ShouldCreateABlankMigration()
{
var db=新的MyProjectDbContextFactory();
//创建设计时服务
var servicecolection=新servicecolection();
serviceCollection.AddEntityFrameworkDesignTimeServices();
serviceCollection.AddDbContextDesignTimeServices(db);
var serviceProvider=servicecolection.BuildServiceProvider();
//创建迁移
var migrationscaffolder=serviceProvider.GetService();
Microsoft.EntityFrameworkCore.Migrations.Design.ScaffoldAdministration migration=migrationsScaffolder.ScaffoldMigration(“测试”、“我的项目”);
var rs=Regex.Replace(migration.MigrationCode,@“\s+”,string.Empty);
//但是,让我们删除所有空白,然后检查它是否有blank Up()函数
rs.Contains(“Up(MigrationBuildermigrationBuilder){}”).ShouldBeTrue();
}
}
}
感谢: 还有正则表达式