使用 PetaPoco 创建全文索引
Create a FULLTEXT INDEX with 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 management studio 中重新创建了错误,因此有额外的行,但错误是相同的):
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
- 我也阅读了一些关于交易范围的内容,但我认为我不需要那个。
我想做的事情:
我想在没有事务的情况下创建全文索引。
亲切的问候
据推测,GetFullTextIndexViewCommand
正在调用 BeginTransaction
或以某种方式引起用户交易
经过一天半的时间,我终于找到了答案。
问题是我们正在使用 ASP.Net 样板。
ABP 使用 Unit Of Work
ASP.NET Boilerplate opens a database connection (it may not be opened immediately, but opened in first database usage, based on ORM provider implementation) and begins a transaction when entering a unit of work method.
我基本上必须禁用此方法中的事务使用才能正常工作。
我正在尝试在我的 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 management studio 中重新创建了错误,因此有额外的行,但错误是相同的):
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
- 我也阅读了一些关于交易范围的内容,但我认为我不需要那个。
我想做的事情:
我想在没有事务的情况下创建全文索引。
亲切的问候
据推测,GetFullTextIndexViewCommand
正在调用 BeginTransaction
或以某种方式引起用户交易
经过一天半的时间,我终于找到了答案。 问题是我们正在使用 ASP.Net 样板。 ABP 使用 Unit Of Work
ASP.NET Boilerplate opens a database connection (it may not be opened immediately, but opened in first database usage, based on ORM provider implementation) and begins a transaction when entering a unit of work method.
我基本上必须禁用此方法中的事务使用才能正常工作。