C# NHibernate别名中的错误
我正在使用NHibernate进行数据库管理。 在一个类中,我使用以下公式计算属性:C# NHibernate别名中的错误,c#,sql,nhibernate,formula,C#,Sql,Nhibernate,Formula,我正在使用NHibernate进行数据库管理。 在一个类中,我使用以下公式计算属性: (SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = Id GROUP BY r.Meter_Id) AS x) 生成的查询如下所示: (SELECT MIN(x.timest
(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = Id GROUP BY r.Meter_Id) AS x)
生成的查询如下所示:
(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = this_.Id GROUP BY r.Meter_Id) AS this_.x)
显然,AS语句中的名称被重命名为此_ux,这会导致错误
这似乎是一个已知的bug:
enyone有解决这个问题的方法吗?我可能弄错了,但我不明白你为什么需要在特定公式中使用别名 从更一般的意义上讲,您有几个选择:
- 解决这个问题。您可以使用存储过程,或者加载更多数据并在内存中进行计算
- 修复它。NHibernate是开源的——提取代码,找到原因,在测试中隔离代码,修复它,然后发送一个提取请求
- 请其他人修复。如果您的公司正在使用NHibernate,并且这对他们很重要,他们可能会赞助另一个NHibernate贡献者来实施修复
SELECT TOP 1 MAX(r.Timestamp) AS timestamp
FROM Reading r, Meter m
WHERE r.Meter_Id = m.Id AND m.Store_Id = Id
GROUP BY r.Meter_Id
order by Max(r.timestamp) asc
当从Fluent NHibernate Map.Formula()方法中调用数据库函数时,我遇到了同样的问题。我的解决方法是重复完整的函数名,而不是尝试使用ailas 例如,其中EntityColumn2是已被引用\加载到实体中的列
SELECT My_Db_Function.Column1
FROM My_Db_Function(arg1, arg2, arg3, ...)
WHERE My_Db_Function.Column2 = EntityColumn2
结果是,My_Db_函数引用保持原样(并且没有被NHibernate使用别名),EntityColumn2被NHibernate正确地使用别名。别名肯定是必需的,因为不使用时会发生SQL错误。我想知道是否有人已经解决了这个问题。如果没有,我想我将使用数据库视图来解决我的问题。名称前缀甚至可以用于类型。在我的例子中,NHibernate在类型
datetime
前面加上了表别名,但是在将其更改为sys.datetime
之后,它就工作了。还提到:“NHibernate将自动将当前实体表的别名预先挂起到任何看起来像非限定列访问的对象”