在MVC应用程序中记录/跟踪CRUD操作

时间:2015-03-04 08:16:18

标签: asp.net-mvc logging log4net crud tracking

我想将所有带有用户详细信息的CRUD操作保存到数据库中,然后根据以下方法监视这些信息。在我看来,第二种方法似乎更好,因此可以从一个特定的表进行管理,也可以用于关键信息。那么,请您通过一个适用的例子说明如何在适用于MVC5和MsSQL Server的框架或自定义代码的情况下如何最好地执行此操作来澄清我?提前谢谢。

方法I:通过将“CreatedBy”,“CreatedOn”等列添加到相关表中,并在这些列上添加/更新信息(“CreatedBy”,“CreatedOn”等)每当添加或更新记录时都会显示表格。在这种情况下,将仅从数据库获得最后的更新信息,并且不能获得先前的操作。

方法II:通过在数据库中创建一个新表并为每个包含“CreatedBy”,“CreatedOn”,“Controller”,“Action”,“Record Id”,“Record Id”的CRUD操作添加新记录Upadte Value“,以及其他必要的字段。

2 个答案:

答案 0 :(得分:2)

我们在所有解决方案中使用方法1:

public partial class Database
{
    public Database(DbConnection connection)
        : base(connection, true)
    {
        CurrentUser = "SYSTEM";
    }

    public string CurrentUser
    {
        get;
        set;
    }

    public override int SaveChanges()
    {
        var changeSet = ChangeTracker.Entries();

        if (changeSet != null)
        {
            foreach (var change in changeSet.Where(x => x.State != EntityState.Unchanged))
            {
                if (change.State == EntityState.Added)
                {
                    SetCreatedFields(change);
                    SetLastChangedFields(change);
                }
                if (change.State == EntityState.Modified)
                {
                    SetLastChangedFields(change);
                }

            }
        }
        return base.SaveChanges();
    }

    private void SetLastChangedFields(DbEntityEntry change)
    {
        var entity = change.Entity as dynamic;
        entity.LastChangedBy= !string.IsNullOrEmpty(CurrentUser) ? CurrentUser : "System";
        entity.LastChanged = DateTime.Now;
    }

    private void SetCreatedFields(DbEntityEntry change)
    {
        var entity = change.Entity as dynamic;
        entity.CreatedBy = !string.IsNullOrEmpty(CurrentUser) ? CurrentUser : "System";
        entity.Created = DateTime.Now;
    }    
}

我意识到使用dymanic不是很好的做法,但它很简单且有效。

答案 1 :(得分:-1)

最后,我找到了Bilal Fazlani的完美文章“Adding Log Feature to Entity Framework”,这非常容易整合到项目中。任何需要使用Code First方法在Entity Framework中进行日志/审核的人都可以轻松地将其应用到自己的项目中。非常感谢你的帮助...