繁体   English   中英

EntityFramework DBContext审核中的错误

[英]Error in EntityFramework DBContext Audit

我的目标是保存和同时创建审核日志。 实体条目状态更改后运行应用程序var result = base.SaveChnages()时,如何克服这一问题,任何人都可以寻求帮助

     public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();
        using (var scope = new TransactionScope())
        {
            var objectStateManager = ((IObjectContextAdapter) this).ObjectContext.ObjectStateManager;
            var modifiedAuditableEntities =
                objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added).Where(
                    e => (IAuditable) e.Entity != null);
            var result = base.SaveChanges();
            foreach (var entry in modifiedAuditableEntities)
            {
                var entity = (IAuditable) entry.Entity;

                if (entity != null)
                {
                    switch (entry.State)
                    {
                        case EntityState.Added:
                            entity.IsAdded = true;
                            break;
                        case EntityState.Deleted:
                            entity.IsDeleted = true;
                            break;
                        case EntityState.Modified:
                            entity.IsModified = true;
                            break;
                    }

                    this.EntitySet<AuditLogEntry>().Add(
                        this.auditLogService.CreateAuditLogEntryForEntity((IAuditable) entry.Entity));
                }
            }
            base.SaveChanges();

            scope.Complete();
            return result;
        }
    }

覆盖“ OnContextCreated”方法并绑定“ SaveChanges”事件处理程序,如下所示:

public partial class MyDataModel
{
    partial void OnContextCreated()
    {
        this.SavingChanges += new EventHandler(CreateAuditLog);
    }

    void CreateAuditLog(object sender, EventArgs e)
    {
         var changes = this.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted | EntityState.Modified);
        if (!changes.Any())
            return;

        var auditDataList = new List<AuditLogEntry>();
        foreach (ObjectStateEntry stateEntryEntity in changes)
        {
            if (!stateEntryEntity.IsRelationship && stateEntryEntity.Entity != null && !(stateEntryEntity.Entity is AuditLogEntry))
            {
                var audit = new AuditLogEntry();
                auditDataList.Add(audit);
            }
        }

        if (auditDataList.Count > 0)
        {
            foreach (var audit in auditDataList)
                this.AddToAuditLogEntries(audit);
        }      
     }  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM