如何实施隐蔽的 SQL 记录变更审计追踪

How to implement covert SQL Records Change Audit-Trail

我的公司想要对 SQL 服务器数据库实施审计。结合在 SO 上找到的许多非常好的解决方案的结果是:

一个接口:

public interface IAuditable
{
    string CreatedBy { get; set; }
    DateTime? CreatedDate { get; set; }
    string CreatedIpAddress { get; set; }
    string ModifiedBy { get; set; }
    DateTime? ModifiedDate { get; set; }
    string ModifiedIpAddress { get; set; }
}

实现接口的BaseClass。注释应该对设计者隐藏属性:

public abstract class BaseModel : IAuditable
{
    [Browsable(false)]
    [Bindable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public string CreatedBy { get; set; }

    [Browsable(false)]
    [Bindable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public DateTime? CreatedDate { get; set; }
    <snip>
    ...
    </snip>
}

派生自 BaseClass 的领域模型:

public class Person : BaseModel
{
    public int Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我覆盖 SaveChanges() 来填充属性。

如果我将集合绑定到 datagridview,它不会显示这些列。然而,智能感知仍然在 lambda 表达式中提供它们。如何从智能感知中隐藏这些属性?

我已经将模型暴露给 UI(是的,我知道,不好的做法)。我正在考虑尝试将这些隐藏在 Julie Lerman 所说的有界上下文中。但我认为我的 SaveChanges() 覆盖将无法填充属性。或者我可能需要像使用 SoftDelete 一样将其推送到 SQL 函数。任何帮助将不胜感激。

不太清楚为什么要对 Intellisense 隐藏这些,但您可以显式实现您的界面。

public abstract class BaseModel : IAuditable
{
    string IAuditable.CreatedBy { get; set; }

    DateTime? IAuditable.CreatedDate { get; set; }
}

这些属性仍然存在,但只有在您明确使用变量或 属性 定义为 IAuditable.

时才能在代码中访问