在我传递给的操作中调用 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 执行插入,这确实有效,但我想做的似乎应该有效。