entity-framework - 在调用 SaveChanges() 之前添加的实体的访问 ID

标签 entity-framework savechanges audit-logging

我使用的是 EF 4.3.1,我已经覆盖了上下文中的 SaveChanges(),这样我就可以获得对象及其状态的列表,并在我的审计日志表中创建条目。我需要将记录的 ID 存储在审计日志表中,以便我对它有一个引用。这是插入记录时的一个问题,因为在保存之前我无权访问该 ID。有什么方法可以在那时获取 ID 吗?

public override int SaveChanges()
{
        ChangeTracker.DetectChanges();

        var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;
        var modifiedAuditableEntities = objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added).Where(e => (IAuditable)e.Entity != null);

        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));
            }
        return base.SaveChanges();
}

最佳答案

如果您的目标是同时创建您的保存和审计日志,您可以将其包装在一个事务范围内,这样您的方法就是原子的。

    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;
        }
    }

关于entity-framework - 在调用 SaveChanges() 之前添加的实体的访问 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12933960/

相关文章:

c# - 创建 Linq 查询时出错

c# - LINQ 按特定列返回不同值

asp.net-mvc - 如何将 userId 传递到模型 ASP.NET MVC 中?

html - 是否可以在本地保存 Firebug 中的更改?

c# - 如何回滚 Entity Framework 中的事务

c# - 无法在 ASP.Net MVC 3 项目中使用 Entity Framework 保存更改

asp.net-mvc - 在 ASP.NET MVC 应用程序上记录用户事件

c# - 如何使用 EF6 Fluent API for MySQL 指定表类型?

javascript - 如何在 Web 应用程序中处理用户审核日志(或其他频繁的客户端操作)?

java - ADF 审核日志记录