如果可以,请帮忙。
我正在使用NHibernate连接到Sql Server实例,一切都很顺利。对于我的测试应用程序(集成测试),我需要使用SQLite。除了使用DateTime.AddDays(n)作为查询的一部分派生日期(DateTime)的那些测试之外,我的所有测试都正常工作。
对于Sql Server,我扩展了MsSql2008Dialect并调用
public class CustomMsSql2008Dialect : MsSql2008Dialect
{
public CustomMsSql2008Dialect()
{
RegisterFunction( "AddDays", new SQLFunctionTemplate( NHibernateUtil.DateTime, "DATEADD(day,?2,?1)" ) );
}
}
并使用
进行配置<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">«namespace redacted».CustomMsSql2008Dialect, «assembly name redacted»</property>
...
</session-factory>
</hibernate-configuration>
我认为这适用于我手动测试的查询。我还创建了所需的HQLGenerator
public class AddDaysGenerator : BaseHqlGeneratorForMethod
{
public AddDaysGenerator()
{
SupportedMethods = new[] {
ReflectionHelper.GetMethodDefinition<DateTime>(d => d.AddDays(0)),
};
}
public override HqlTreeNode BuildHql( MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor )
{
return treeBuilder.MethodCall( "AddDays",
visitor.Visit( targetObject ).AsExpression(),
visitor.Visit( arguments[0] ).AsExpression()
);
}
并与
注册相同public class ExtendedLinqtoHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public ExtendedLinqtoHqlGeneratorsRegistry() : base()
{
this.Merge( new AddDaysGenerator() );
}
}
并使用
进行配置configuration.LinqToHqlGeneratorsRegistry<«namespace redacted».ExtendedLinqtoHqlGeneratorsRegistry>();
我尝试将此扩展到SQLite但是使用以下类:
public class CustomSQLiteDialect : NHibernate.Dialect.SQLiteDialect
{
public CustomSQLiteDialect()
{
RegisterFunction(
"AddDays",
new SQLFunctionTemplate( NHibernateUtil.DateTime, "date(?1, '+' || ?2 ||' day')"
)
);
}
}
并使用
配置我的测试项目<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
<property name="dialect">«namespace redacted».CustomSQLiteDialect, «assembly name redacted»</property>
...
</session-factory>
</hibernate-configuration>
每次测试都会产生
System.NotSupportedException: Specified method is not supported.
带有堆栈跟踪的
NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)
NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary``2 enabledFilters, ISessionFactoryImplementor factory)
NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary``2 enabledFilters)
NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
Remotion.Linq.QueryableBase``1.GetEnumerator()
System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
我有很多疑问要测试。
这是SQLite中的错误吗?
这是NHibernate中的错误吗?
这(可能)是我如何实现这个的错误吗?
再次,请帮助。