Fluent Nhibernate ApplyFilter on Join 列
Posted
技术标签:
【中文标题】Fluent Nhibernate ApplyFilter on Join 列【英文标题】:Fluent Nhibernate ApplyFilter on Join column 【发布时间】:2011-07-17 18:30:01 【问题描述】:我正在尝试对从另一个表连接(和投影)的列应用过滤器 (ApplyFilter)。我有以下实体:
public class User
public virtual int Id get; private set;
public virtual string EMail get; set;
...
public virtual bool IsActive get; set;
public virtual int CompanyId get; set;
使用 UserMap:
public class UserMap : ClassMap<User>
public UserMap()
Table("Users");
Id(x => x.Id, "UserId");
Map(x => x.EMail);
...
Join("CompanyUser", r =>
r.KeyColumn("UserId");
r.Map(x => x.IsActive);
r.Map(x => x.CompanyId);
r.Fetch.Join();
);
ApplyFilter<CompanyFilter>("this_1_.CompanyId = :companyId");
这实际上现在有效,但正如您所见,我必须在过滤器中包含 CompanyUser 表的别名“this_1_”...这听起来不正确,但如果我将过滤器保留为在FilterDefinition类中定义我得到一个Sql:
where this.CompanyId = ?p0
未映射'因为 CompanyId 列来自不同的投影(CompanyUser as this_1_)
有没有办法纠正这个问题并让 nhibernate 找出过滤器的正确别名?
提前感谢您的帮助。
【问题讨论】:
我也很想知道这个问题的答案。您找到更好的解决方案了吗? @RenanMalkeStigliani 不,我最终只是暂时忍受它,我还没有找到解决方案....如果我找到它,我会确保在这里发布它跨度> 【参考方案1】:我认为您必须在联接上应用过滤器:
Join("CompanyUser", r =>
r.KeyColumn("UserId");
r.Map(x => x.IsActive);
r.Map(x => x.CompanyId);
r.Fetch.Join();
).ApplyFilter<CompanyFilter>("CompanyId = :companyId");
【讨论】:
感谢您的回答,但我不确定这是否能解决我的问题,“this_1_.CompanyId”引用在映射类中被硬编码......所以当我将用户与其他实体一起加入时有companyId,“this_1_.companyId”应该是“this_2_”... 你能试试新版本吗(经过我的修改)?我认为 NHibernate 会解析过滤器并在需要时添加正确的别名。以上是关于Fluent Nhibernate ApplyFilter on Join 列的主要内容,如果未能解决你的问题,请参考以下文章
用 Fluent Nhibernate 定义 NHibernate 过滤器的语法?
Fluent NHibernate and Mysql,SQLite
Fluent NHibernate - NHibernate.QueryException:无法解析属性
Fluent Nhibernate and Stored Procedures
Castle Windsor 3 + Fluent NHibernate + Castle.NHibernate.Integration