MVC& amp; amp; amp; amp;实体框架(使用sprocs)

时间:2011-08-22 18:07:28

标签: asp.net-mvc entity-framework audit

我面临着需要审核MVC应用程序用户所做的数据更改的挑战。

审核创建和删除记录很容易。

更新证明是问题所在。

我正在寻找一种自动化方法,但我遇到的问题是应用程序正在使用存储过程来恢复EF“复杂类型”。

然后使用它们构建视图模型,并在回发后,控制器接收从视图传回的表单值构建的新视图模型。因此,原始值不再可用。

是否有人建议采用安全的方式保留原始值,以便将其与更新后的值进行比较,以便存储更改?

(我很感激我可以回到这些数据库,但效率不高,我必须保留所有参数来重新制作相同的调用,并找到一种方法来自动化该部分过程。)< / p>

3 个答案:

答案 0 :(得分:0)

您是否使用INSERTED和DELETED表尝试了审核触发器。 http://weblogs.asp.net/jgalloway/archive/2008/01/27/adding-simple-trigger-based-auditing-to-your-sql-server-database.aspx

OR

在用于插入,删除,更新的存储过程中,您可以使用FOR XML AUTO。获取记录的XML并将其添加到审计表中。 http://www.a2zdotnet.com/View.aspx?Id=71

更新一个T-SQL示例

BEGIN
-- these tables would be in your database
DECLARE @table TABLE(ID INT IDENTITY(1,1) PRIMARY KEY, STR VARCHAR(10), DT DATETIME)
DECLARE @audit_table TABLE(AuditXML XML, Type VARCHAR(10), Time DATETIME)
-- this is defined at the top of your stored procedure
DECLARE @temp_table TABLE(PK INT)
-- your stored procedure will add an OUTPUT to the temp table
INSERT INTO @table 
    OUTPUT inserted.ID INTO @temp_table
    VALUES  ('test1', GetDate()),
            ('test2', GetDate() + 2)
-- at the end of your stored procedure update your audit table
INSERT INTO @audit_table
    VALUES(
        (
            SELECT * 
                FROM @table 
                WHERE ID IN (SELECT PK FROM @temp_table) 
                FOR XML AUTO
        ), 
        'INSERTION', 
        GETDATE()
    )
-- your audit table will have the record data
SELECT * FROM @audit_table
END

在上面的示例中,您可以将temp_table作为表的克隆(包含表中的所有列),并在OUTPUT子句中使用INSERTED。* INTO @temp_table,这样可以避免在获取FOR XML之前重新选择记录汽车。另一个注意事项,对于执行DELETE的存储过程,您将在OUTPUT中使用DELETED。*而不是INSERTED。*。

答案 1 :(得分:0)

如果使用SQL Server,我建议您查看Change Data Capture(CDC)。

这是一个开箱即用的解决方案,用于审核应用程序底层表的更改,并且设置相对简单,因此不需要您必须维护的自定义解决方案。

如果您的站点有任何支持应用程序,它们也将受到保护,它还可以审核直接针对数据库所做的任何更改,例如来自运行脚本的DBA。

由于您的asp.net应用程序可能在一个特定帐户下运行,因此您可能需要添加其他跟踪信息以捕获进行更改的用户。幸运的是,这也相对简单。以下Stack Overflow question涵盖了使用ObjectStateManager

的方法

答案 2 :(得分:0)

我自己正在寻找这个,发现这个,看看Tracker for EF