【问题标题】:Fluent Nhibernate ApplyFilter on Join columnFluent Nhibernate ApplyFilter on Join 列
【发布时间】: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 不,我最终只是暂时忍受它,我还没有找到解决方案....如果我找到它,我会确保在这里发布它跨度>

标签: join fluent-nhibernate mapping


【解决方案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 会解析过滤器并在需要时添加正确的别名。
猜你喜欢
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多