【发布时间】:2017-01-23 01:14:23
【问题描述】:
我正在尝试使用 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());
}
在内存配置设置期间注册此功能是否缺少什么?它与模式导出的运行顺序有关吗?
【问题讨论】:
-
我在问这个问题之前发现了那个帖子。我仍然无法弄清楚。当我在 BeforeBindMapping 处理程序中设置断点时,它永远不会被调用。 RegisterFunction 方法在我的 customDialect 类中被调用,但是当我之后检查配置时,它显示没有注册任何函数。
标签: c# sqlite nhibernate fluent-nhibernate