使用SQLite进行流畅的Nhibernate内存数据库测试-在Select语句中调用用户函数时出现语法错误
本文关键字:用户 调用 语句 函数 错误 语法 Select SQLite 数据库测试 内存 Nhibernate | 更新日期: 2023-09-27 18:07:08
我试图得到我们的内存数据库使用SQLite和Nhibernate 4.0和Fluent Nhibernate集成测试工作。
其中一个实体有这样的映射:Map(x => x.ShowNameLine2).Formula("FileTaxes.funcMultiplePayersExist(Id, TIN, User_Id)");
我的问题是,当运行下面的查询时,我得到一个SQLite语法错误(我已经剥离了所有非必要的部分):
SELECT
batch.Id,
FileTaxes.funcMultiplePayersExist(p.Id, p.TIN, p.User_Id) as formula
FROM "Batch" batch
LEFT OUTER JOIN "BatchPayer" bp ON batch.Id = bp.Batch_id
LEFT OUTER JOIN "Payer" p ON bp.Payer_id = p.Id
----> System.Data.SQLite.SQLiteException : SQLite error near "(" : syntax error
我尝试定义自定义方言并注册函数:
public class CustomSQLiteDialect : SQLiteDialect
{
protected override void RegisterColumnTypes()
{
base.RegisterColumnTypes();
...
}
protected override void RegisterFunctions()
{
base.RegisterFunctions();
...
RegisterFunction("FileTaxes.funcMultiplePayersExist", new StandardSQLFunction("FileTaxes.funcMultiplePayersExist", NHibernateUtil.Int32));
}
}
我们已经定义了我们的内存配置如下,但我仍然得到错误时运行我的测试使用内存配置和内存会话工厂:
private static NHibernate.Cfg.Configuration _configuration;
public static FluentConfiguration InMemoryConfiguration()
{
if (_inMemoryConfigurationSingleton != null)
return _inMemoryConfigurationSingleton;
_inMemoryConfigurationSingleton =
Fluently.Configure()
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<FormMap>().Conventions.AddFromAssemblyOf<Conventions.LengthAttributeConvention>())
.Database(SQLiteConfiguration.Standard.InMemory().ShowSql().Driver<CustomSQLite20Driver>().Dialect<CustomSQLiteDialect>();)
.ExposeConfiguration(config =>
{
config.BeforeBindMapping += BeforeBindMappingHandler;
var schemaExport = new SchemaExport(config);
_configuration = config;
schemaExport.Create(true, true);
});
_inMemoryConfigurationSingleton.BuildConfiguration();
return _inMemoryConfigurationSingleton;
}
public static ISessionFactory InMemorySessionFactory()
{
return _inMemorySessionFactorySingleton ?? (_inMemorySessionFactorySingleton = InMemoryConfiguration().BuildSessionFactory());
}
在内存配置设置过程中是否缺少此功能?它是否与模式导出运行的顺序有关?
可能在您附加事件处理程序时已经构建了映射。
我必须首先构建配置,并将其用作流利的参数。配置使其工作:
var cfg = new Configuration();
cfg.BeforeBindMapping += BeforeBindMappingHandler;
var sessionFactory = Fluently.Configure(cfg)
....
;