在继承的表中实现行级安全列

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; 


【讨论】:

以上是关于在继承的表中实现行级安全列的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中实现继承:备选方案和只有代理键的表

如何在代码中首先在 TPT(每种类型的表)继承中启用级联删除?

如何首先在代码中实现多级继承

通过将安全视图分配给角色并提供针对多个条件的过滤器,在 Snowflake 上实现行级安全性 (RLS)

如何在 Google bigquery 中为多个动态表创建授权视图?

C# Winform DataGridView中实现二维表头