我有一个简单的模式,如下所示:
这个想法是有用户、部门和流程。对于每个部门,用户可以“星标”多个流以“标记”它们(因此部门/用户对可以有多个流)。
理想情况下,我想使用以下类:
public class User
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
}
public class Department
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual IDictionary<User, IList<StarredFlow>> StarredFlows { get; protected set; }
public Department()
{
this.UserStarredFlows = new Dictionary<User, IList<StarredFlow>>();
}
}
public class Flow
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
protected Flow() { }
}
public class StarredFlow
{
public virtual int Id { get; protected set; }
public virtual User User { get; protected set; }
public virtual Department EntryPoint { get; protected set; }
public virtual Flow Flow { get; protected set; }
public virtual string Name { get; protected set; }
protected StarredFlow() { }
public StarredFlow(User user, Department ep, Flow flow, string name)
{
this.User = user;
this.EntryPoint = ep;
this.Flow = flow;
this.Name = name;
}
}
这将允许非常文字代码:
var userStarredFlowsForDepartment = department.StarredFlows[currentUser];
但是,NHibernate 不支持列表的映射字典。我发现了一个类似的问题/答案,涉及将 移动IList<StarredFlow>
到新类并使用组件对其进行映射。遗憾的是,FluentNHibernate 不支持使用组件进行集合映射(没有HasMany
脱离组件映射)。
这对于 NHibernate 来说似乎是一件微不足道的事情,但我正在努力寻找解决方案。有没有更好的解决方案来做到这一点?我真的很想不必解决只使用session.Save(starredFlow)
andQuery<StarredFlow>()
因为它们将逻辑移到模型之外。