【发布时间】:2014-10-06 20:20:57
【问题描述】:
从问题标题中您可能会猜到这是关于什么的。我将尝试描述我目前拥有的以及我想要归档的内容。
假设一个应用程序处理四个实体:User、Team、Repository 和 Document。这些实体之间的关系是:
- 每个用户都属于零个或多个团队。
- 每个文档都属于一个存储库
- 用户可以拥有零个或多个存储库
- 每个 repository 都可以创建为 public 或 private
- 公共存储库的内容对所有与存储库所有者共享团队的用户可见。
- 私有存储库仅对其所有者可见。
访问用户的文档不是问题,这些都是存储在他拥有的存储库中的所有文档。但是事情变得复杂了,因为我真正需要的是对用户可见的所有文档,这是所有文档以及其他人公开并与他共享团队的文档。
目前我正在数据访问层中执行此授权机制。这意味着获取所有文档并按照上述规则进行一些过滤。我知道这个实现是不可扩展的,我想知道我是否可以通过将授权逻辑移动到数据库来改进我的数据库模型。这样过滤将由数据库引擎完成,只有请求的实体才会返回给客户端代码。
这个问题与特定的实现无关,但我会为我正在使用的特定工具标记它。也许它对某人的回答有用。
【问题讨论】:
-
查看您的标签,我想您使用 Linq to 实体来执行查询文档。从您的问题来看,我真的不明白为什么您应该获取所有文档并在代码中过滤它们。你不能在 EF 编译 SQL 查询之前使用 Linq 查询。要使您的用户、团队和(取决于您的确切设计)存储库也必须在数据库中,但您的问题已经指向数据库引擎。
-
@Ric.Net 如果我错了,请纠正我,但我认为选择正确文档集的 LINQ 查询无法由 EF 翻译。它会尽力而为,但仍会检索所有文档。
-
如果模型正确,EF 将不会获取所有记录。今晚我将添加一个答案。问题:存储库可以由多个用户拥有吗?如果您称其为存储库的“所有者”,那就太奇怪了。
-
@Ric.Net 存储库将归一个用户所有。
-
A 完全基于 Linq 查询添加了答案。我将进一步编辑此答案以使其成为完整的示例。现在去睡觉;-)
标签: c# database-design asp.net-mvc-5 authorization entity-framework-6