我想将所有带有用户详细信息的CRUD操作保存到数据库中,然后根据以下方法监视这些信息。在我看来,第二种方法似乎更好,因此可以从一个特定的表进行管理,也可以用于关键信息。那么,请您通过一个适用的例子说明如何在适用于MVC5和MsSQL Server的框架或自定义代码的情况下如何最好地执行此操作来澄清我?提前谢谢。
方法I:通过将“CreatedBy”,“CreatedOn”等列添加到相关表中,并在这些列上添加/更新信息(“CreatedBy”,“CreatedOn”等)每当添加或更新记录时都会显示表格。在这种情况下,将仅从数据库获得最后的更新信息,并且不能获得先前的操作。
方法II:通过在数据库中创建一个新表并为每个包含“CreatedBy”,“CreatedOn”,“Controller”,“Action”,“Record Id”,“Record Id”的CRUD操作添加新记录Upadte Value“,以及其他必要的字段。
答案 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中进行日志/审核的人都可以轻松地将其应用到自己的项目中。非常感谢你的帮助...