如何在创建审计跟踪时获取新记录ID?

时间:2016-04-05 09:12:16

标签: c# entity-framework



public override saveChanges(){
    var changeList = tracker.detectChange();
    foreach(var change in changeList){
        switch(change.state){
            case ADD: ...
            case MODIFIED: ...
        }
    }
      
      
    base.saveChanges();
}




我有上面的代码结构(仅用于说明想法的伪代码),在保存更改时创建审计跟踪。

唯一的问题是,我无法获取新添加的记录ID,因为saveChanges尚未被调用,但如果我提前调用saveChanges,则跟踪器无法跟踪所有更改条目的状态将变为unchanged

那么如何在获取新记录ID时仍然跟踪更改?

EDITED

我可能想要获取新记录ID的原因是在DB中保存审计跟踪记录。出于某种原因,它必须是一个XML文档,它存储实体的ID,原始值和数据。新价值(以及其他一些不受关注的事情)。

说新添加的"项目"在DB的Item表中,我必须存储一个新的审计跟踪记录,至少显示这个新的"项目" ' ID,原始值(为空)和新值。

1 个答案:

答案 0 :(得分:3)

在调用方法saveChanges之前,可以根据状态将已更改的实体添加到单独的列表中。

saveChanges之后,所有实体都将使用新的ID更新,相应的列表可用于生成审核日志。

public override saveChanges(){
    // gather audit data
    initialize List<Entity> addedEntities, modifiedEntities, deletedEntities
    var changeList = tracker.detectChange();
    foreach(var change in changeList){
        switch(change.state){
            case ADD: add to addedEntities
            case MODIFIED: add to modifiedEntities
        }
    }


    base.saveChanges();
    performAudit(addedEntities, modifiedEntities, deletedEntities);
}

function performAudit(...){
  generateXML(...);
  saveToDB(...);
  sendEmail(...);
}

注意:我没有测试deletedEntities是否仍然有效,但无论如何都可以在saveChanges之前审核它们,因为它们已经有了Id。但我希望你能对如何解决问题有所了解。