无法审核插入实体框架。我被困了你可以帮忙吗?

时间:2010-12-07 10:12:25

标签: c# .net entity-framework entity-framework-4

这是我的第三天,让我发疯。

每当我需要进行审核时,因为我需要新的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;
  }

如何审核插入?任何一个例子?

4 个答案:

答案 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