跟踪实体/对象的更改

时间:2018-04-09 11:23:12

标签: c# asp.net-mvc entity-framework

我想知道使用C#和实体框架跟踪MVC应用程序中的实体或对象的更改有哪些选项?

我已经读过,一个常见的建议是使用属性更改事件在发生更改时发出警报,然后我可能会执行我需要对该事件执行的操作。

然而,我还需要它自动以及新创建的项目,而不仅仅是现有的属性。

基本上我想要一个关于发生了什么以及是谁发起它的审计线索。 只跟踪写入数据库和基本审计的项目,例如公司名称发生变化,变更内容,更改内容,更改者以及更改时间等....

除了属性更改之外还有哪些方法可用,或者是否有可以使用的工具?

1 个答案:

答案 0 :(得分:1)

您需要审计跟踪,因此这需要在数据库级别而不是MVC级别完成。

每个表都应该有一个"更新"包含更新的确切UTC日期和时间的列,以及" updatedBy"包含上次更新用户身份的列。

每次表更改时,都应该触发将行版本复制到存档(审计)表。然后,您可以随时查看该审计跟踪,以找出最近更改的人员,还可以查看该行的任何先前版本,甚至是该表的任何时间点视图。

审计表可以(应该)由触发器自动维护。

E.g:

create table Animal (
    id integer primary key,
    name nvarchar(max),
    description nvarchar(max),
    updated datetime,
    updatedBy nvarchar(max)
)

create table AnimalAudit (
    id integer,
    name nvarchar(max),
    description nvarchar(max),
    updated datetime,
    updatedBy nvarchar(max),
    updateAction char(1),
    primary key (id, updated)
)


create trigger TRG_Animal_Audit 
AFTER INSERT,UPDATE,DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT AnimalAudit
    select id, name, description, updated, updatedBy, 'C' from INSERTED where not exists (select 1 from DELETED where INSERTED.id = DELETED.id);
    INSERT AnimalAudit
    select id, name, description, updated, updatedBy, 'U' from INSERTED where exists (select 1 from DELETED where INSERTED.id = DELETED.id);
    INSERT AnimalAudit
    select id, name, description, updated, updatedBy, 'D' from DELETED where NOT exists (select 1 from INSERTED where INSERTED.id = DELETED.id);

END