使用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());
    }

在内存配置设置过程中是否缺少此功能?它是否与模式导出运行的顺序有关?

使用SQLite进行流畅的Nhibernate内存数据库测试-在Select语句中调用用户函数时出现语法错误

可能在您附加事件处理程序时已经构建了映射。

我必须首先构建配置,并将其用作流利的参数。配置使其工作:

var cfg = new Configuration();
cfg.BeforeBindMapping += BeforeBindMappingHandler;
var sessionFactory = Fluently.Configure(cfg)
   .... 
;