我有一个简单的模式,如下所示:
其理念是有用户、部门和流程。对于每个部门,用户可以“星”多个流来“书签”它们(因此部门/用户对可以有多个流)。
理想情况下,我希望使用以下类:
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不支持列表的映射字典。我发现了一个similar question/answer涉及到将
IList<StarredFlow>
移动到一个新类并使用组件映射它。遗憾的是,fluentnhibernate不支持使用组件进行集合映射(组件映射没有关闭)。这似乎是一件小事,但我正在努力寻找解决办法。有更好的解决办法吗?我真的不想解决只使用
HasMany
和session.Save(starredFlow)
的问题,因为它们将逻辑移到模型之外。 最佳答案
你想做的绝对不受支持。我并不是说这不是一个理论上有效的设计,但是nhibernate不支持它,而且将来也不太可能这样做。
也就是说,您可以在Department
中始终有一个方法,而不是字典,使用IQueryable
:
public IEnumerable<StarredFlow> GetUserStarredFlows(IQueryable<StarredFlow> source,
User user)
{
return source.Where(x => x.User == user)
.ToList(); //you could skip this depending on your usage
}
或者(稍微复杂一点)可以注入
IQueryable
或会话。