流利的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不支持这种不寻常的连接类型。我会完全按照你说的去做。使用两个集合——User.SupervisorForms
和User.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()
。