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 else结束 我犯了一个错误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
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