模拟资源所有权的最佳方式

时间:2016-10-13 10:33:59

标签: sql-server database entity-framework

假设我的数据模型中有多个(少于50个)实体,出于安全原因,我需要存储谁拥有此实体。如果允许对资源执行特定操作的用户执行该操作(谁在哪个资源上执行操作),我需要能够决定每个请求。为此,需要资源所有权。

我可以想到几种不同的方法来做到这一点。一个是在每个表格中我可以有一个指向所有者的外键。这个解决方案的一个缺点是在代码中我需要查看每个表以找出所有权。每次添加新表时,我都需要更新代码以查看新表。

另一种解决方案可能是将每个特定实体视为通用资源,即拥有所有权的资源。并将所有权存储在一个表中。我甚至可以在没有任何外键关系的情况下这样做,并在代码中处理它以保持资源表同步,例如确保任何表中的每个新条目在“资源”表中都有相应的记录。一个明显的缺点是该表中会有很多记录。好处是有一个地方可以找到所有权。

那么首选方式是什么?将所有权存储在一个表中是否存在性能问题,因为最终可能存在数十万条记录(可能甚至数百万条)?保留大量外键约束的成本如何?有没有更好的方法来解决这个问题?

由于

1 个答案:

答案 0 :(得分:0)

您正在使用面向对象的语言。继承是解决这个问题的最佳选择。

根据您是使用Code First还是DB First,您的方法会略有不同,但归结为:

  1. 制作和抽象类,你可以称之为'OwnableEntity'。实质上,您将外键和导航属性放在那里。
  2. 从“OwnableEntity”
  3. 继承您的所有实体
  4. 确保您在EF中的继承映射是正确的(在这种情况下,您可能希望使用TPC inheritance映射)
  5. 从现在开始,您可以针对'OwnableEntity'编写'检查所有权'逻辑,对于您稍后实施的每个实体都可以。