C# Fluent NHibernate和多个键列
我有一个具有IList属性的用户实体。映射 这看起来像这样: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"); 现在我有了一个新的特性请求,它本质上增加了另一个特性
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>();