这是我的第三天,让我发疯。
每当我需要进行审核时,因为我需要新的GeneratedID,因此对于我来说,插入隐藏的SaveChanges对我来说并不好 您添加新记录时获得的
我已经覆盖了SaveChanges,现在我可以使用主键获取新添加的条目。
我的问题在于我现在要插入一个newLog,我需要再次调用SaveChanges。
要么我以无限循环结束,要么我将记录插入两次。
如果需要新插入对象的主键,如何审核插入内容,例如(CustomerId)
public override int SaveChanges(SaveOptions options)
{
int changes = base.SaveChanges(SaveOptions.DetectChangesBeforeSave);
IEnumerable<ObjectStateEntry> entries = Context.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
foreach (ObjectStateEntry entry in entries)
{
var auditLog=CreateAuditLog(Entry);
}
//Because I have saved I now got the new Id. I now need to save the newly created log and therefore
//I call save again but now this will save again all the previous stuff too or get in a infinite loop
//Is there a way I could just save the newly added stuff what is the workaround?
base.SaveChanges();
return changes;
}
如何审核插入?任何一个例子?
答案 0 :(得分:4)
你有在代码中执行吗?
为什么不在数据库中使用触发器并将记录复制到审计表中?
另一种方法可能是创建一个Dictionary<T,bool>
来保存审核项目。
审核完项目后,将密钥(bool)设置为true,表示已经过审核。
或者另一种选择是不要立即保存审计,而是将其持久存储到其他商店(内存,缓存,会话等)。
然后,根据您使用的应用程序类型,您可以在“请求”结束时将这些经过审核的项目提交到数据库中。
我只是在这里抛出想法 - 但我仍然相信触发器将是最容易/最安全的事情。
答案 1 :(得分:0)
我不知道您的审核日志是什么样的,但是如果它有对Entry的引用,那么在调用base.SaveChanges()之前不能创建CreateAuditLog(Entry),并且ID应该都可以解决。
答案 2 :(得分:0)
我想你可能想尝试一些不同的东西:
创建另一个类来管理保存更改并保存审计日志,如下所示(想想这是一种伪代码 - 它不完整,但应该给你一个想法):
public void Save(Context context)
{
using (Transaction scope = new TransactionScope)
{
context.SaveChanges(SaveOptions.DetectChangesBeforeSave);
auditContext = new MyAuditContext();
var auditLog=CreateAuditLog(Entry);
myAudtContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
scope.Complete();
context.AcceptChanges();
myAuditContext.AcceptChanges()
}
}
答案 3 :(得分:0)
在游戏中有点晚了但我遇到了这个帖子,因为我遇到了同样的问题。调用ObjectStateEntry.AcceptChanges
方法对我有用。 MSDN文章here