7

在我传递给的操作中调用 FluentMigrator 的构建器方法Execute.WithConnection会导致抛出空引用异常。

我想要做的是选择一些数据,以便我可以在 c# 中操作它,因为这比在 T-SQL 中操作它更容易,并使用我的 c# 操作的结果来更新数据或插入新数据(将更具体地说,我需要从存储的 url 字符串中选择一个查询字符串参数并将其插入到其他位置)。

我看到在迁移中选择数据的唯一方法是自己使用Execute.WithConnection和检索数据(FluentMigrator 不提供用于选择数据的帮助器),但如果我尝试在操作中使用任何流利的迁移器表达式,我传递给Execute.WithConnection空引用异常是抛出。

这是我的代码的简化版本:

[Migration(1)]
public class MyMigration : Migration 
{
  public void Up() 
  {
    Execute.WithConnection(CustomDml);
  }

  public void CustomDml(IDbConnection conn, IDbTransaction tran)
  {
    var db = new NPoco.Database(conn).SetTransaction(tran); // NPoco is a micro-ORM, a fork of PetaPoco
    var records = db.Fetch<Record>("-- some sql"); // this is immediately evaluated, no reader is left open
    foreach (var r in records) {
      var newValue = Manipulate(r.OriginalValue);
      Insert.IntoTable("NewRecords").Row(new { OriginalValueId = r.Id, NewValue = newValue }); // <-- this line causes the exception
    }
  }

  public void Down() {}
}

调用 Inser.IntoTable 的行会导致从第 36 行抛出空异常FluentMigrator\Builders\Insert\InsertExpressionRoot.cs- 此时 _context 变量似乎可能为空,但我不明白为什么会这样。(在测试 Create.Table 时,例如,它发生在第 49 行FluentMigrator\Builders\Create\CreateExpressionRoot.cs

任何帮助,将不胜感激。也许对于 DML 在迁移中是否合适存在分歧,我愿意接受建议,但这种情况仅在本周就出现了两次。现在,我只是在操作中使用我的微 ORM 而不是 FluentMigrator 执行插入,这确实有效,但我想做的似乎应该有效。

4

1 回答 1

4

使用 Execute.WithConnection 表达式时,您得到的只是数据库连接和事务。

使用 Execute.WithConnection 创建一个PerformDBOperationExpression表达式。处理表达式时,处理器调用 Operation 属性(SqlServerProcessor 中的示例)并且处理器没有对 MigrationContext 的引用。但即使它确实可以访问 MigrationContext,但当 FluentMigrator 进入处理阶段时,已经为时已晚。您将尝试在表达式中处理表达式,而目前 FluentMigrator 不是为处理这种类型的嵌套而构建的。

另一种方法是使连接字符串在迁移上下文中可用,请参阅此问题:https ://github.com/schambers/fluentmigrator/issues/240

那会是更好的方法吗?

于 2013-04-03T21:19:46.553 回答