标签: fluent-migrator

如何在C#中为数据库数据进行集成测试?

我最近一直在针对ASP.Net MVC控制器操作编写一些集成测试,并且由于难以设置为了运行测试而需要存在的测试数据而感到沮丧.

例如,我想测试控制器的"添加","编辑"和"删除"操作.我可以编写"添加"测试,但后来发现编写"编辑"测试我要么必须调用"添加"测试的代码来创建一个记录,以便我可以编辑它,或者在测试类中做了很多设置,这两个设置都没有特别吸引人.

理想情况下,我想使用或开发集成测试框架,以便以可重用的方式为集成测试添加种子数据,以便安排/行为/断言测试的安排方面可以集中精力安排我特别需要安排的内容我的测试而不是关注自己安排一些参考数据,这些参考数据只与测试下的代码间接相关.

我碰巧使用NHibernate,但我相信任何数据播种功能都应该忽略它,并且能够直接操作数据库; ORM可能会改变,但我总是会使用SQL数据库.

我正在使用NUnit,因此设想挂钩测试/ testfixture setup/teardown(但我认为一个好的解决方案可能会转移到其他测试框架).

我在我的主项目中使用FluentMigrator来管理参考数据的模式和种子,因此它很好,但不是必须能够使用FluentMigrator框架在整个解决方案中采用一致的方法.

所以我的问题是,"你如何为C#中的集成测试种下数据库数据?" 你直接执行SQL吗?你使用框架吗?

c# asp.net-mvc integration-testing nunit fluent-migrator

5
推荐指数
1
解决办法
1825
查看次数

FluentMigrator是否支持创建过滤索引?

是否可以使用FluentMigrator 创建过滤索引?方案是,我想在可能包含NULL的列上创建唯一索引,因此过滤器应排除索引列具有NULL的行。

我已经修改了由FluentMigrator生成的SQL Server 2012中的索引,以使用这种过滤器,并且可以确认它工作正常,因此剩下的难题就是生成此选项。

sql-server indexing fluent-migrator sql-server-2012

5
推荐指数
1
解决办法
1352
查看次数

使用FluentMigrator强制重新运行以前的迁移

当我之间有60或70个迁移并且我不想/不能进行完全回滚时,如何强制3个月大的迁移重新运行?

显然,提供我要它重新运行的值的--version参数是行不通的,并且仅从VersionInfo表中删除该值也不可行(两者一起完成似乎也没有任何好处) 。

有没有办法让FluentMigrator从几个月前重新运行一次迁移?我是在激怒这个问题吗?

fluent-migrator

5
推荐指数
1
解决办法
609
查看次数

如何检查是否需要运行迁移或是否使用流畅的迁移器运行迁移?

使用FluentMigrator,有没有办法找出MigrateUp()函数是否确实会迁移某些东西或者它是否已经是最新的?

fluent-migrator

5
推荐指数
1
解决办法
1377
查看次数

FluentMigrator 默认值设置为另一列的值

我正在尝试将默认值设置为另一列的当前值。有什么方法可以使用 FluentMigrator 轻松做到这一点吗?

public override void Up()
{
    Alter.Table(NomTable.VenteMetadata).AddColumn("Column").AsString()
    .NotNullable().WithDefaultValue("??");
}

public override void Down()
{
    Delete.Column("Column").FromTable(NomTable.VenteMetadata);
}
Run Code Online (Sandbox Code Playgroud)

c# fluent-migrator

5
推荐指数
1
解决办法
1981
查看次数

如何使用 FluentMigrator 运行配置文件迁移?

我正在使用 FluentMigrator 来管理我的数据库更改,我像这样执行迁移:

const string connectionString = @"Data Source=localhost, 1433;Initial Catalog=testdb;Integrated Security=SSPI;";
            Announcer announcer = new TextWriterAnnouncer(s => System.Diagnostics.Debug.WriteLine(s));
            announcer.ShowSql = true;

            Assembly assembly = Assembly.GetAssembly(typeof (MigrationMarker));
            IRunnerContext migrationContext = new RunnerContext(announcer);

            var options = new ProcessorOptions
                              {
                                  PreviewOnly = false, // set to true to see the SQL
                                  Timeout = 60
                              };

            var factory = new SqlServer2008ProcessorFactory();
            IMigrationProcessor processor = factory.Create(connectionString, announcer, options);
            var runner = new MigrationRunner(assembly, migrationContext, processor);

            runner.MigrateUp(true);
Run Code Online (Sandbox Code Playgroud)

但我不明白的是如何针对特定配置文件执行迁移?

鉴于我的迁移器具有如下属性:

[Profile("DevMigration")]
public class DevMigration : FluentMigrator.Migration …
Run Code Online (Sandbox Code Playgroud)

c# fluent-migrator

4
推荐指数
1
解决办法
3782
查看次数

如何在 FluentMigrator 迁移中检索插入的身份

在迁移期间,如何插入到我的表中,然后检索 ID,然后使用它在另一个表中插入相关数据。

我现在拥有的是要插入的硬编码 ID,但我不知道运行迁移时它会是什么。

var contactId = 2;
var phoneNumber = 2;

Insert.IntoTable("Contacts")
    .WithIdentityInsert()
    .Row(new
    {
        Id = contactId,
        TimeZoneId = contact.TimeZoneId,
        contact.CultureId,
        Type = (byte)(int)contact.Type,
        Email = contact.Email.ToString(),
        EntityId = entityId
    });

 Insert.IntoTable("PhoneNumbers")
    .WithIdentityInsert()
    .Row(new
    {
        Id = phoneNumberId,
        phone.Number,
        Type = (byte)(int)phone.Type,
        ContactId = contactId
    });
Run Code Online (Sandbox Code Playgroud)

我希望能够检索插入的 ID 并将其用于第二次插入,而不是对其进行编码。

我正在使用 SQL Server,如果有帮助的话...

我认为这会是微不足道的,但在谷歌搜索之后似乎并非如此,并且在这里没有看到任何答案。

c# sql-server fluent-migrator

4
推荐指数
1
解决办法
6160
查看次数

使用Fluent迁移器将初始行添加到表中

我是一个经典的程序员,是泛型新手,这是一个asp.net MVC5示例应用程序,用于学习使用流畅的migrator lib集成授权(用户/角色)的目的。我想在创建表时将一些示例数据添加到表中(使用迁移器控制台工具)。

收到编译错误:USERNAME在当前上下文中不存在,
我应该添加到using部分或任何以下示例中:Insert.IntoTable方法?

(谢谢)

namespace SampleApp.Migrations
{
    [Migration(1)]
    public class AuthMigrations:Migration
    {
        public override void Up()
        {
            Create.Table("users").
                WithColumn("ID").AsInt32().Identity().PrimaryKey().
                WithColumn("USERNAME").AsString(128).
                WithColumn("EMAIL").AsCustom("VARCHAR(128)").
                WithColumn("PASSWORD_HASH").AsString(128);

            Create.Table("roles").
                WithColumn("ID").AsInt32().Identity().PrimaryKey().
                WithColumn("NAME").AsString(128);

            Create.Table("role_users").
                WithColumn("ID").AsInt32().Identity().PrimaryKey().
                WithColumn("USER_ID").AsInt32().ForeignKey("users", "ID").OnDelete(Rule.Cascade).
                WithColumn("ROLE_ID").AsInt32().ForeignKey("roles", "ID").OnDelete(Rule.Cascade);

            //Error:The name 'USERNAME' does not exist in the current context

            Insert.IntoTable("users").Row(new { USERNAME:"superadmin",EMAIL:"superadmin@mvcapp.com",PASSWORD_HASH:"dfgkmdglkdmfg34532+"});
            Insert.IntoTable("users").Row(new { USERNAME:"admin",EMAIL:"admin@mvcapp.com",PASSWORD_HASH:"dfgkmdglkdmfg34532+"});
        }

        public override void Down()
        {
            Delete.Table("role_users");
            Delete.Table("roles");
            Delete.Table("users");
        }

    }
Run Code Online (Sandbox Code Playgroud)

 namespace SampleApp.Models
{
    public class User
    {
        public virtual int Id { get; set; }
        public virtual string Username …
Run Code Online (Sandbox Code Playgroud)

fluent-nhibernate fluent-migrator fluent-nhibernate-mapping asp.net-mvc-5

4
推荐指数
1
解决办法
2791
查看次数

每次运行迁移脚本

我有一个特定的 DB 脚本需要作为最后一个迁移脚本运行,并且每次我在 DB 上运行迁移时都需要运行它(即使它之前已经运行过)。

我可以使用非常大的迁移 ID 来确保此迁移最后运行。但是,我不知道如何强制每次重新运行此迁移:一旦它运行,它就会被添加到dbo.VersionInfo表中,下次 FluentMigrator 在该表中看到它时,它不会再次运行它。

[Migration ( 209912312359 )]
public class M209912312359 : Migration
{
    public override void Down ()
    {
        // I want this particular migration to always run
        // as the last migration script and to run every time.
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有某种迁移属性告诉 FluentMigrator 每次运行此脚本而不管以前的运行情况?(Migration基类对此没有任何要覆盖的内容。)

我正在使用 FluentMigrator 1.4。

编辑:

这是一个数据迁移,清理了数据库中的一些数据。在工作中,我们有大量的数据库(相同的模式,不同的数据)。一个特定的表(我们称之为dbo.A)必须在所有数据库中具有相同顺序的相同数据。我们使用迁移将数据添加到此表中,但有时 - 取决于特定数据库中运行的迁移 - 的实例dbo.A可能会不同步。

此迁移的目的是确保所有实例dbo.A都以相同的顺序包含相同的数据。我们不能删除dbo.A并重新创建它,因为它的ID列被用作外键。

如果可能的话,我想要一个迁移解决方案,因为迁移是唯一可以保证在我们所有环境中作为部署的一部分运行的东西,而改变它会非常困难。(如果 FluentMigrator 不能做到这一点,我们可能别无选择。)

.net c# sql-server fluent-migrator

4
推荐指数
1
解决办法
2104
查看次数

FluentMigrator 从进程内迁移运行程序生成 SQL 输出

有没有办法使用In-Process Migration Runner生成 SQL 文件输出,类似于使用工具中的-output 命令参数可以实现的结果dotnet-fm

我在 中找不到任何属性、字段或方法IMigrationRunnerIMigrationRunnerBuilder或者在IMigrationProcessorOptions设置中找不到任何属性、字段或方法来配置输出。

我错过了什么吗?

c# database-migration fluent-migrator

4
推荐指数
1
解决办法
1009
查看次数