Entity framework 使用实体框架创建审计跟踪的更好方法
我已经查看了许多使用实体框架创建审计跟踪的示例,还没有找到任何适合我的方法。必须有一种巧妙/简洁的方法来实现这一点,只需在DB上下文中覆盖SaveChanges并使用ChangeTracker…我遇到的问题是,当添加(创建)一个实体时,它在保存它之前没有ID,而当保存它时,它似乎会破坏更改跟踪器中的内容。无论如何,我有一个审计跟踪工作,但它是丑陋的地狱,我正在寻求帮助,以简化这一点,使之成为这样,我不必添加到一个可怕的如果然后每次我添加一个实体!感谢您的帮助Entity framework 使用实体框架创建审计跟踪的更好方法,entity-framework,audit,change-tracking,Entity Framework,Audit,Change Tracking,我已经查看了许多使用实体框架创建审计跟踪的示例,还没有找到任何适合我的方法。必须有一种巧妙/简洁的方法来实现这一点,只需在DB上下文中覆盖SaveChanges并使用ChangeTracker…我遇到的问题是,当添加(创建)一个实体时,它在保存它之前没有ID,而当保存它时,它似乎会破坏更改跟踪器中的内容。无论如何,我有一个审计跟踪工作,但它是丑陋的地狱,我正在寻求帮助,以简化这一点,使之成为这样,我不必添加到一个可怕的如果然后每次我添加一个实体!感谢您的帮助 public bool Cr
public bool CreateRecord(object o)
{
Audit audit = new Audit()
{
ChangeTypeID = (int)Audit.ChangeType.CREATE,
TimeStamp = GetCurrentDateTime(),
RecordClass = o.GetType().ToString(),
NewValue = "",
ReasonForChange = "Record Creation"
};
if (o.GetType() == typeof(Permission))
{
Permission x = (Permission)o;
audit.OriginalValue = x.ToString();
Permissions.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(User))
{
User x = (User)o;
audit.OriginalValue = x.ToString();
Users.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(LogIn))
{
LogIn x = (LogIn)o;
audit.OriginalValue = x.ToString();
LogIns.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Marker))
{
Marker x = (Marker)o;
audit.OriginalValue = x.ToString();
Markers.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Method))
{
Method x = (Method)o;
audit.OriginalValue = x.ToString();
Methods.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Sample))
{
Sample x = (Sample)o;
audit.OriginalValue = x.ToString();
Samples.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(Run))
{
Run x = (Run)o;
audit.OriginalValue = x.ToString();
Runs.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else if (o.GetType() == typeof(XYDataSet))
{
XYDataSet x = (XYDataSet)o;
audit.OriginalValue = x.ToString();
XYDataSets.Add(x);
SaveChanges();
audit.RecordID = x.ID;
}
else
{
return false;
}
// Save audit record
audit.UserID = ((App)Application.Current).GetCurrentUserID();
Audits.Add(audit);
SaveChanges();
return true;
}
我假设所有的实体都属于同一个项目/程序集,所以您可以尝试类似的方法,并注意到这段代码没有经过测试,可能需要修改
public bool CreateRecord(object o)
{
Audit audit = new Audit()
{
ChangeTypeID = (int)Audit.ChangeType.CREATE,
TimeStamp = GetCurrentDateTime(),
RecordClass = o.GetType().ToString(),
NewValue = "",
ReasonForChange = "Record Creation"
};
var entityType = Assembly.GetAssembly(typeof(Permission)).GetTypes().Where(x => x == o.GetType())
.FirstOrDefault(); // Determine the desired entity (assumed all of the entities belongs to same project/assembly)
if (entityType != null)
{
var convertedObject = Convert.ChangeType(o, entityType); // Convert object to entity
audit.OriginalValue = convertedObject.ToString();
var entity = yourContext.Set(entityType).Add(convertedObject); // Get DbSet for casted entity
SaveChanges();
audit.RecordID = x.ID;
}
else
{
return false;
}
// Save audit record
audit.UserID = ((App)Application.Current).GetCurrentUserID();
Audits.Add(audit);
SaveChanges();
return true;
}
我假设所有的实体都属于同一个项目/程序集,所以您可以尝试类似的方法,并注意到这段代码没有经过测试,可能需要修改
public bool CreateRecord(object o)
{
Audit audit = new Audit()
{
ChangeTypeID = (int)Audit.ChangeType.CREATE,
TimeStamp = GetCurrentDateTime(),
RecordClass = o.GetType().ToString(),
NewValue = "",
ReasonForChange = "Record Creation"
};
var entityType = Assembly.GetAssembly(typeof(Permission)).GetTypes().Where(x => x == o.GetType())
.FirstOrDefault(); // Determine the desired entity (assumed all of the entities belongs to same project/assembly)
if (entityType != null)
{
var convertedObject = Convert.ChangeType(o, entityType); // Convert object to entity
audit.OriginalValue = convertedObject.ToString();
var entity = yourContext.Set(entityType).Add(convertedObject); // Get DbSet for casted entity
SaveChanges();
audit.RecordID = x.ID;
}
else
{
return false;
}
// Save audit record
audit.UserID = ((App)Application.Current).GetCurrentUserID();
Audits.Add(audit);
SaveChanges();
return true;
}
非常非常感谢!这让我有了90%的机会。唯一的问题是,在我的每个实体中,我都有一个ID主键。在上面的代码中,您留下了我的残留(现在未声明)x变量“audit.RecordID=x.ID”。基本上,我保存的是实体的类型和主键ID,这样我就可以从审计跟踪返回到任何实体。我接下来的问题是,我们如何从转换的对象中提取ID?(再次感谢你的帮助!!!)不客气。你想试试这个吗?var id=entityType.GetProperty(“id”).GetValue(convertedObject,null);“非常感谢!这让我有了90%的机会。唯一的问题是,在我的每个实体中,我都有一个ID主键。在上面的代码中,您留下了我的残留(现在未声明)x变量“audit.RecordID=x.ID”。基本上,我保存的是实体的类型和主键ID,这样我就可以从审计跟踪返回到任何实体。我接下来的问题是,我们如何从转换的对象中提取ID?(再次感谢你的帮助!!!)不客气。你想试试这个吗?“var id=entityType.GetProperty(“id”).GetValue(convertedObject,null);”对于更通用的对象,可以尝试使用its。对于更通用的对象,可以尝试使用its。