流利的NHibernate和多个键列

本文关键字:NHibernate | 更新日期: 2023-09-27 17:53:21

我有一个User实体,它有一个IList属性。的映射它看起来像这样:

        HasMany(x => x.Forms) 
            .Cascade.None() 
            .AsBag().KeyColumn("Supervisor") 
            .Key(key => key.Not.Update()) 
            .PropertyRef("Email"); 

现在我有一个新的功能请求,实质上增加了另一个KeyColumn也应该填充到这个属性中。从本质上讲,每个表格可以有一个"主管"和一个"候补",我需要这个属性来填充User.Email等于任意一个的任何窗体一个(表单属于用户,如果User.Email == Form.Supervisor OR User.Email == Form.Alternate)。

有办法做到这一点吗?简单地添加另一个KeyColumn规范只是覆盖前一个规范,并通过添加键Keys()方法似乎不允许像I这样的多个键列想要……我在寻找一种方法来告诉它关系应该找到一个WHERE Superviser = Email OR Alternate = Email,但它似乎不支持OR从句…

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

有什么建议吗?

流利的NHibernate和多个键列

据我所知,NHibernate不支持这种不寻常的连接类型。我会完全按照你说的去做。使用两个集合——User.SupervisorFormsUser.AlternateForms,然后再组合它们,可能使用LINQ的Concat方法来这样做。您可以定义一个属性来完成此连接:

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

如果你想加载一个User和一个完全初始化的Forms集合在一个单一的往返数据库,那么你可以使用这个方法从NHibernate文档的提高性能-多查询部分:

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>();

这段代码使用了CreateMultiQuery()和HQL -但是这种方法应该与您选择的查询批处理语法一样好:CreateMultiQuery()CreateMultiCriteria()Future()/FutureValue()