C# Fluent NHibernate和多个键列

C# Fluent NHibernate和多个键列,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有一个具有IList属性的用户实体。映射 这看起来像这样: HasMany(x => x.Forms) .Cascade.None() .AsBag().KeyColumn("Supervisor") .Key(key => key.Not.Update()) .PropertyRef("Email"); 现在我有了一个新的特性请求,它本质上增加了另一个特性

我有一个具有IList属性的用户实体。映射 这看起来像这样:

        HasMany(x => x.Forms) 
            .Cascade.None() 
            .AsBag().KeyColumn("Supervisor") 
            .Key(key => key.Not.Update()) 
            .PropertyRef("Email"); 
现在我有了一个新的特性请求,它本质上增加了另一个特性 也应填充到此属性中的KeyColumn。基本上, 每个表格可以有一个“主管”和一个“候补”,我需要这个 属性来填充
User.Email
等于 一个(如果
User.Email==Form.Supervisor或User.Email==Form.Alternate
,则表单属于用户)

有办法做到这一点吗?只需添加另一个
KeyColumn
规范只是覆盖上一个规范,并通过
Keys()
方法似乎不允许像I这样的多个键列 希望我在寻找一种方法来告诉它 应该找到与
的关系,其中Superviser=Email或Alternate=Email
,但它似乎不支持
子句

我的另一个选择是复制这个映射,但在另一个属性中使用“Alternate”,然后在我的消费代码中将集合猛击在一起,但我想看看NHibernate是否足够聪明,可以实现这一点


有什么建议吗?

据我所知,no-NHibernate不支持这种特殊类型的加入。我会像你说的那样处理这个问题。使用两个集合-
User.SupervisorForms
User.AlternateForms
,然后在以后组合它们,也许可以使用LINQ的
Concat
方法进行组合。您可以定义一个属性来执行此连接:

public virtual IEnumerable<Form> Forms
{
    get { return SupervisorForms.Concat(AlternateForms); }
}

这段代码使用了
CreateMultiQuery()
和HQL-但是这种方法应该与您选择的查询批处理语法一样有效:
CreateMultiQuery()
CreateMultiCriteria()
,或者
Future()
//FutureValue(),这正是我最后要做的,当我在NHibernate基地巡视时,什么也没有得到。这与我希望尽可能地限制SQL命中率的愿望背道而驰(这实际上是SQL命中率的两倍),但它起作用了,并且没有对性能造成太大的影响。添加了有关在数据库的一次往返中预加载这两个集合的信息。注意-NHForge目前似乎已关闭,因此链接已断开,但谷歌有一个新的解决方案。
User user = s.CreateMultiQuery()
    .Add("select u from User u left join fetch u.SupervisorForms where u.Id = :id")
    .Add("select u from User u left join fetch u.AlternateForms where u.Id = :id")
    .SetInt32("id", 123)
    .UniqueResult<User>();