NHibernate创建Criteria关联可空外键表过滤报错问题
解决方案:NHibernate Criteria过滤可空外键关联实体
问题出在你直接使用嵌套属性路径(如BookingCartItem.Status)时,未先通过NHibernate的API建立实体间的关联关系,导致框架无法解析该属性对应的数据库映射。以下是两种可行的解决方式:
方式一:使用CreateAlias创建关联别名
通过CreateAlias建立AgencyAgreement与BookingCartItem的内连接(内连接会自动过滤掉外键为空的记录),再基于别名添加条件:
var criteria = _session.CreateCriteria<AgencyAgreement>(); // 创建BookingCartItem的别名,使用内连接筛选非空关联 criteria.CreateAlias("BookingCartItem", "bci", JoinType.InnerJoin); // 基于别名设置Status条件 criteria.Add(Restrictions.Eq("bci.Status", (int)BookingCartStatus.Cancelled));
方式二:使用CreateCriteria创建子查询
通过CreateCriteria创建子查询,同样用内连接关联到BookingCartItem,再在子查询中添加状态条件:
var criteria = _session.CreateCriteria<AgencyAgreement>(); // 内连接到BookingCartItem子实体 var cartItemCriteria = criteria.CreateCriteria("BookingCartItem", JoinType.InnerJoin); // 直接在子查询中设置Status过滤条件 cartItemCriteria.Add(Restrictions.Eq("Status", (int)BookingCartStatus.Cancelled));
为什么之前的写法报错?
NHibernate Criteria API无法直接解析未建立关联的嵌套属性路径(BookingCartItem.Status),必须先通过CreateAlias或CreateCriteria明确实体间的关联关系,框架才能正确映射到对应的数据库表和字段,否则会抛出属性路径无法解析的错误。
内容的提问来源于stack exchange,提问作者Elvis Sulejmanovski
相关产品推荐
相关产品推荐

