2009-12-07 61 views
0

首先,我有三个实体。管理类时,一切都是相对于用户在nhibernate(orm)

用户,角色,项

一个用户可以有多个角色。 一个项目被分配到一个或多个角色。

因此,用户将有权访问一组不同的项目。

现在有几种方法可以看到这个工作。

  1. 有一个用户集合通过多对多的关联有角色。然后,此集合中的每个角色都将拥有自己的Items集合。因此,对于每个用户,我必须获得用户(使用nhib并获取角色和项目),然后对每个角色中的项目执行selectMany以获取用户的所有项目,或者执行一些foreach到端口数据到视图或dto模型。

  2. 创建一个数据库触发器,以自动插入到另一个只有用户和项目之间关系的表中,以便在我的用户实体上我只有一个Items集合,其中包含所有项目分配给我。

  3. 还有一些我还想不到的方式,因为我是nHibernate的新手。

现在我知道触发器感觉不对,但我不知道如何做到这一点。稍后,用户可能负责一组用户,我们也有一些层次结构。如果任何人都可以阐明他们如何在nhibernate或另一个orm中进行这些场景,那将是非常棒的,或者指向一个方向。

我知道在过去,您必须将所有组合输入到表中,以便查询能够正常工作,但是当您知道sql时,它不会太糟糕。

如果您需要任何其他信息,请让我知道。 干杯

+0

澄清: 你能以某种方式给实体添加额外的约束,以减少一对多的多对多关系吗?例如,以特定方式将这些项目映射到角色。 您使用哪种查询API? LINQ? – smaclell 2009-12-23 06:57:26

回答

0

查看codeplex上的NhibernateProvider。它是ASP.Net成员资格的实现。所以它有角色,用户,应用程序。这可能会给你一些关于如何进行的想法。

1

逻辑映射是用户被分配给许多角色(反之是角色有很多用户,如果你真的需要跟踪),并且Item对许多角色可见(再次,只有在你真的需要跟踪那个)。

Ayende用Rhino Security解决了这个问题。看看他所有的博客文章,请看http://ayende.com/Blog/category/548.aspx。从本质上讲,他使用NHibernate拦截器来扩展任何带有安全信息的查询,这意味着一旦你设置了“正常工作”的权限,你就不必担心为查询添加安全问题。

如果你不想使用这个检索/显示给定用户的所有项目,那么你将要选择那些对任何一个角色可见的所有项目用户是的成员:

  1. 查找所有角色的当前用户具有
  2. 找到所有包含角色的列表为用户的项目

    VAR roleIds = DetachedCriteria.For 。新增(Restrictions.IdEq(currentUser.Id) ) .CreateCriteria(“Roles”) .SetProjection(Projections.Id);

    变种项= session.CreateCriteria() .CreateCriteria( “VisibleTo”) 。新增(Subqueries.PropertyIn( “ID”,roleIds)) 的.List();

写下我的头顶,所以可能需要进一步调整。

相关问题