Nhibernate 如何映射列(如果存在),否则为空

Nhibernate 如何映射列(如果存在),否则为空,nhibernate,Nhibernate,我试图将一个属性映射到一个公式,以便在列if存在时选择值,否则为默认值 我尝试了以下方法 mapper.Mapx=>x.GroupId.Formulaselect case when exists select*from INFORMATION_SCHEMA.COLUMNS SYS\u COLS\u TBL其中SYS\u COLS\u TBL.TABLE\u NAME='Azure'和SYS\u COLS\u TBL.COLUMN\u NAME='GroupId',然后此\u.GroupId e

我试图将一个属性映射到一个公式,以便在列if存在时选择值,否则为默认值

我尝试了以下方法

mapper.Mapx=>x.GroupId.Formulaselect case when exists select*from INFORMATION_SCHEMA.COLUMNS SYS\u COLS\u TBL其中SYS\u COLS\u TBL.TABLE\u NAME='Azure'和SYS\u COLS\u TBL.COLUMN\u NAME='GroupId',然后此\u.GroupId else结束

我犯了一个错误
SqlException:列名“GroupId”无效。

此SQL语句将返回名称为“Azure”的所有表

select * from INFORMATION_SCHEMA.COLUMNS SYS_COLS_TBL 
 WHERE SYS_COLS_TBL.TABLE_NAME ='Azure' 
   AND SYS_COLS_TBL.COLUMN_NAME = 'GroupId'
但是,可能有两张这样的桌子。。但是在不同的模式中。如果发生这种情况,我们可以查询dbo.Azure。。当SomeOtherSchema.Azure具有列GroupId时。这将解决它:

select * from INFORMATION_SCHEMA.COLUMNS SYS_COLS_TBL 
 WHERE SYS_COLS_TBL.TABLE_NAME ='Azure' 
   AND SYS_COLS_TBL.COLUMN_NAME = 'GroupId'
   AND SYS_COLS_TBL.TABLE_SCHEMA = 'dbo'
此外,要支持更复杂的查询联接关联,请删除此项:

而不是:

then this_.GroupId else '' end)
使用:


NHibernate将根据上下文提供适当的别名。SQL语句要求表和列的所有引用都存在。因此,您得到的列名“GroupId”错误无效

通常的方法是使用动态sql sp_executesql@sql:

但这不起作用,因为您已经在SQL语句的上下文中,并且不可能在那里注入动态SQL

要解决此问题,有几种解决方案:

正确的解决方案:在数据库中创建缺少的列

痛苦的解决方案:将对象映射到存储过程,该存储过程将执行类似于上述的动态SQL

疯狂痛苦的解决方案:将可能丢失的列映射为正常。在构建工厂之前,请自省您的模型,删除缺少的列的映射或将其映射更改为公式。这类似于NHibernate的方法,但不是抛出错误,而是需要从映射中删除这些列


实际上你没有回答这个问题。这个问题和这个很相似,但是。。。
then GroupId else '' end)
DECLARE @sql NVARCHAR(MAX) = '
SELECT '+
    (CASE WHEN EXISTS (SELECT *
                       FROM INFORMATION_SCHEMA.COLUMNS 
                       WHERE TABLE_SCHEMA = 'dbo' AND --assuming the schema is dbo
                             TABLE_NAME = 'Azure' AND
                             COLUMN_NAME = 'GroupId'
                      )
          then 'GroupId'
          else 'NULL as GroupId'
     end) + '
FROM Azure';

exec sp_executesql @sql