我想知道使用C#和实体框架跟踪MVC应用程序中的实体或对象的更改有哪些选项?
我已经读过,一个常见的建议是使用属性更改事件在发生更改时发出警报,然后我可能会执行我需要对该事件执行的操作。
然而,我还需要它自动以及新创建的项目,而不仅仅是现有的属性。
基本上我想要一个关于发生了什么以及是谁发起它的审计线索。 只跟踪写入数据库和基本审计的项目,例如公司名称发生变化,变更内容,更改内容,更改者以及更改时间等....
除了属性更改之外还有哪些方法可用,或者是否有可以使用的工具?
答案 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