用PetaPoco创建一个FULLTEXT索引

时间:2016-09-27 13:03:17

标签: c# tsql petapoco

我试图在我的sql数据库中使用petapoco创建全文索引。 我的编程语言是C# 这是我尝试执行的代码的一小部分: 小注意:方法this.GetFullTextIndexViewCommand(keyDataField,databaseViewName,formDefinition.FullTextSearch.DataEntity,fields); 相当长,它会生成基于给定字段创建视图的命令。

using (var db = new PetaPoco.Database(this.connectionStringName))
     {
        var keyDataField = formDefinition.Fields.Single(f => f.FormField == formDefinition.KeyField).DataField;
        var fields = formDefinition.Fields;
        var form = formDefinition.Form;
        var databaseViewName = string.Concat(FullTextIndexViewPrefix, form);
        var fullTextIndexCommand = $"CREATE FULLTEXT INDEX ON [{this.Schema}].{databaseViewName}(SearchText) KEY INDEX IX_{databaseViewName} ON {FullTextCatalogName}";
        var fullTextIndexViewCommand = this.GetFullTextIndexViewCommand(keyDataField, databaseViewName, formDefinition.FullTextSearch.DataEntity, fields);
        var uniqueIndexCommand = $"CREATE UNIQUE CLUSTERED INDEX IX_{databaseViewName} ON [{this.Schema}].{databaseViewName}({keyDataField})";

        db.Execute(fullTextIndexViewCommand);
        db.Execute(uniqueIndexCommand);
        db.Execute(fullTextIndexCommand);
     }

我可以确认在这些语句之后,FullTextIndexViewCommand已成功执行。 uniqueIndexCommand已成功执行。 但是FullTextIndexCommand给了我以下错误(我在SQL管理工作室中重新创建了错误,因此额外的行,但错误是相同的):

Msg 574, Level 16, State 0, Line 2
CREATE FULLTEXT INDEX statement cannot be used inside a user transaction.

我试过做了几件事:

  • 我读到了这个错误的原因,我完全明白了。
  • 将db.Execute(fullTextIndexCommand)放在它自己的using语句中。没有运气
  • 已验证没有其他逻辑正在创建交易。
  • 如果我看db变量,我看到:_transaction:null和_transactionCancelled:false
  • 我还读了一些关于交易范围的内容,但我认为我不需要。

我想做什么:

我想在没有交易的情况下创建FULLTEXT INDEX。

亲切的问候

2 个答案:

答案 0 :(得分:2)

经过一天又一半,我终于找到了答案。 问题是我们正在使用ASP.Net Boilerplate。 ABP使用Unit Of Work

  

ASP.NET Boilerplate打开数据库连接(可能不会立即打开,但在第一次使用数据库时打开,基于ORM提供程序实现)并在输入工作单元方法时开始事务。

我基本上不得不禁用此方法中的事务使用。

答案 1 :(得分:0)

猜测,GetFullTextIndexViewCommand正在调用BeginTransaction或以某种方式导致用户交易