当一切都与 nhibernate (orm) 中的用户相关时管理类

Posted

技术标签:

【中文标题】当一切都与 nhibernate (orm) 中的用户相关时管理类【英文标题】:managing classes when everything is relative to a user in nhibernate (orm) 【发布时间】:2009-12-07 06:10:02 【问题描述】:

首先我有三个实体。

用户、角色、项目

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

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

现在有几种方法我可以看到它的工作原理。

    有一个关于用户的集合,它通过多对多关联具有角色。那么这个集合中的每个角色都会有自己的项目集合。因此,对于每个用户,我必须获取用户(使用 nhib 并使用它获取角色和项目)然后要么对每个角色中的项目执行 selectMany 以获取用户的所有项目,要么执行几个 foreach 移植数据到视图或 dto 模型。

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

    我还想不到其他一些方法,因为我是 nHibernate 的新手。

现在我知道触发器感觉不对,但我不知道该怎么做。稍后我们还会有一些层次结构,其中一个用户可能负责一组用户。如果有人可以阐明他们如何在 nhibernate 或其他很棒的 orm 中处理这些场景,或者指出一个方向。

我知道在过去您必须将所有组合输入到一个表中以便查询工作,但是当您知道 sql 时它还不错。

如果您需要任何其他信息,请告诉我。 干杯

【问题讨论】:

澄清:您能否以某种方式向实体添加额外的约束以将多对多关系减少为一对多?例如,定义项目以特定方式映射到角色。您使用的是哪个查询 API? LINQ? 【参考方案1】:

逻辑映射是将用户分配给许多角色(如果您确实需要跟踪,则相反的角色有许多用户)并且项目对许多角色可见(同样,只有在您确实需要跟踪时才应创建反向那个)。

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

如果您不想使用它来检索/显示给定用户的所有项目,那么您将需要选择对该用户所属的任何角色可见的所有项目:

    查找当前用户拥有的所有角色

    查找包含用户角色列表的所有项目

    var roleIds = DetachedCriteria.For .Add(Restrictions.IdEq(currentUser.Id)) .CreateCriteria("角色") .SetProjection(Projections.Id);

    var items = session.CreateCriteria() .CreateCriteria("VisibleTo") .Add(Subqueries.PropertyIn("Id", roleIds)) .List();

写在我的脑海里,所以可能需要进一步调整。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于当一切都与 nhibernate (orm) 中的用户相关时管理类的主要内容,如果未能解决你的问题,请参考以下文章

多 ORM 解决方案 [关闭]

从 Oracle 数据库构建 NHibernate ORM

什么 PHP ORM 最像 NHibernate?

Nhibernate 与其他 ORM 的区别是啥?

ORM篇——有关NHibernate查询封装

如何在 ORM (NHibernate) 中模拟这种情况?