在 MVC 应用程序中记录/跟踪 CRUD 操作
Logging / Tracking CRUD operations in MVC application
我想将所有带有用户详细信息的CRUD操作保存到数据库中,然后根据以下方法监控这些信息。在我看来,第二种方法似乎更好,因此它可以从一个特定的 table 进行管理,也可以用于关键信息。那么,您能否通过提供一个适用示例来说明我如何使用框架或自定义代码(对于 MVC5 和 MsSQL Server 为 suitable)来最好地执行此操作?提前致谢。
方法 I: 通过将 "CreatedBy"、"CreatedOn" 等列添加到相关的 table 和 add/update每当添加或更新记录时,这些 table 上的信息("CreatedBy"、"CreatedOn" 等)。在这种情况下,只能从数据库中获取最新的更新信息,而无法获取之前的操作。
方法二: 通过在数据库中创建一个新的 table 并为每个包含 "CreatedBy"、"CreatedOn"、[=27 的 CRUD 操作添加一条新记录=]、"Action"、"Record Id"、"Upadte Value" 和其他必填字段。
我们在所有解决方案中都使用方法 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
不是很好的做法,但它很简单而且有效。
最后我找到了 Bilal Fazlani 的完美文章“Adding Log Feature to Entity Framework”,这真的很容易集成到项目中。任何需要使用 Code First 方法在 Entity Framework 中 log/audit 的人都可以轻松地将其应用到自己的项目中。非常感谢您的帮助...
我想将所有带有用户详细信息的CRUD操作保存到数据库中,然后根据以下方法监控这些信息。在我看来,第二种方法似乎更好,因此它可以从一个特定的 table 进行管理,也可以用于关键信息。那么,您能否通过提供一个适用示例来说明我如何使用框架或自定义代码(对于 MVC5 和 MsSQL Server 为 suitable)来最好地执行此操作?提前致谢。
方法 I: 通过将 "CreatedBy"、"CreatedOn" 等列添加到相关的 table 和 add/update每当添加或更新记录时,这些 table 上的信息("CreatedBy"、"CreatedOn" 等)。在这种情况下,只能从数据库中获取最新的更新信息,而无法获取之前的操作。
方法二: 通过在数据库中创建一个新的 table 并为每个包含 "CreatedBy"、"CreatedOn"、[=27 的 CRUD 操作添加一条新记录=]、"Action"、"Record Id"、"Upadte Value" 和其他必填字段。
我们在所有解决方案中都使用方法 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
不是很好的做法,但它很简单而且有效。
最后我找到了 Bilal Fazlani 的完美文章“Adding Log Feature to Entity Framework”,这真的很容易集成到项目中。任何需要使用 Code First 方法在 Entity Framework 中 log/audit 的人都可以轻松地将其应用到自己的项目中。非常感谢您的帮助...