如何实现隐蔽的SQL记录更改Audit-Trail

时间:2015-09-16 15:38:00

标签: c# sql-server ef-code-first intellisense audit-trail

我的公司想要为SQL Server数据库实施审核。在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,它不会显示这些列。然而,intellisense仍然在lambda表达式中提供它们。如何从智能感知中隐藏这些属性?

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

1 个答案:

答案 0 :(得分:1)

不太确定为什么要将这些隐藏在Intellisense中,但您可以明确地实现您的界面。

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

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

这些属性仍然存在,但只有在明确使用定义为IAuditable的变量或属性时才能在代码中访问。