在继承的表中实现行级安全列
Posted
技术标签:
【中文标题】在继承的表中实现行级安全列【英文标题】:Implement Row Level security column in inherited tables 【发布时间】:2018-06-15 03:44:16 【问题描述】:我正在使用实体框架和代码优先方法来生成数据库。我在 SQL Server 中引入了行级安全性。
我想创建 3 个表,其中所有常见属性都转到 ItemVersion
并将相关属性记录到 DocumentVersion
并将相关内容形成到 FormVersion
某某。我应该在所有 3 个表中引入行级安全列 TenantId
。
interface ITenantSecurityPolicy
int TenantId get; set;
public class ItemVersion : ITenantSecurityPolicy
public int Id get; set;
public int CreatedPersonId get; set;
public string Title get; set;
public string Description get; set;
public int TenantId get; set;
[Table("DocumentVersions")]
public class DocumentVersion : ItemVersion
[StringLength(100)]
public string DocumentVersionNumber get; set;
public int FileId get; set;
[Table("FormVersions")]
public class FormVersion : ItemVersion
public string DesignerContentId get; set;
当我生成数据库时,它不会在子类中创建TenantId
- 列TenantId
仅在ItemVersion
表中创建。
我该如何处理这种情况?有什么解决方法或建议吗?
【问题讨论】:
你在哪个 EF 版本? 安装的版本是6.1.3 通常,EF 应该只为两个子类型创建表,包括基本类型的所有列。您还有其他映射吗? 是的。我正在使用数据注释进行表拆分。注意 DocumentVersion 和 FomVersion 有[Table("FormVersions")]
注释。
是的,我知道,但是模型如您所见不应创建ItemVersion
表。
【参考方案1】:
最简单的解决方案也可能是多租户架构的正确关系设计:使 TenantId 成为主键中的前导列。
public class ItemVersion : ITenantSecurityPolicy
[Key,Column(Order=0)]
public int TenantId get; set;
[Key,Column(Order=1),DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id get; set;
public int CreatedPersonId get; set;
public string Title get; set;
public string Description get; set;
【讨论】:
以上是关于在继承的表中实现行级安全列的主要内容,如果未能解决你的问题,请参考以下文章
如何在代码中首先在 TPT(每种类型的表)继承中启用级联删除?
通过将安全视图分配给角色并提供针对多个条件的过滤器,在 Snowflake 上实现行级安全性 (RLS)