C# 跟踪实体/对象的更改

C# 跟踪实体/对象的更改,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我想知道使用C#和实体框架跟踪MVC应用程序中实体或对象的更改的选项是什么 我读过一篇文章,其中一个常见的建议是使用属性更改事件在发生更改时发出警报,然后我可能会在该事件上执行我需要执行的操作 但是,我需要它自动创建新的项目,而不仅仅是现有的属性 基本上,我想对发生的事情以及是谁发起的进行审计跟踪。 只跟踪写入数据库和基本审计的项目,如公司名称是否更改、更改的来源、更改的目的、更改的人以及更改的时间 除了属性更改,还有什么方法可用?或者我可以使用什么工具?您需要审计跟踪,因此这需要在数据库级别而

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

我读过一篇文章,其中一个常见的建议是使用属性更改事件在发生更改时发出警报,然后我可能会在该事件上执行我需要执行的操作

但是,我需要它自动创建新的项目,而不仅仅是现有的属性

基本上,我想对发生的事情以及是谁发起的进行审计跟踪。 只跟踪写入数据库和基本审计的项目,如公司名称是否更改、更改的来源、更改的目的、更改的人以及更改的时间


除了属性更改,还有什么方法可用?或者我可以使用什么工具?

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

每个表都应该有一个“更新”列,其中包含准确的UTC更新日期和时间,还有一个“updatedBy”列,其中包含上次更新的用户的身份

每次表发生更改时,都应该有一个触发器将行版本复制到存档(审核)表中。然后,您可以随时查阅该审计跟踪,以找出谁进行了最新的更改,还可以查看该行的任何早期版本,甚至表的任何时间点视图

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

例如:


这实际上有点棘手,建议你谷歌,难道你不想跟踪http请求吗?还是要跟踪到服务器的SQL查询?或者要跟踪任何实体的更改,如跟踪每个属性更改?或者你想跟踪一些商业行为,比如“完成订单、用户注册、添加新产品”?这里有很多不清楚的地方。例如,您可能只希望跟踪已保存的更改,而不仅仅是对属性的任何更改。例如,我获取一个用户“John Doe”,我将属性更改为“Johnny Doe”,然后更改为“Johnny D”,然后才将用户保存到数据库中。您是否希望看到“Johnny Doe”也发生更改,即使该值从未到达数据库?这取决于许多因素。你在说什么样的变化?您跟踪他们的目的是什么?您需要哪些详细信息?e、 g.您需要知道是否修改了某些内容(真/假),您需要知道修改了哪些属性,您需要跟踪更改以便可以撤消它们。每一个场景都是不同的。感谢所有到目前为止的评论,我将尝试澄清一下。我使用的是实体框架(抱歉,没有提到这一点)。我想实施基本审计,如果公司名称改变,它从什么,改为什么,由谁,何时。。。。并且仅将值写入数据库。像ASP.NET样板文件实体历史记录这样的东西会起作用吗?它似乎使用了IEntityHistoryStore
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