在调用savechanges()之前,添加实体的访问ID



我正在使用ef 4.3.1,我在上下文上覆盖了savechanges(),以便我可以获取对象及其状态的列表,并在审核中创建条目日志表。我需要将记录的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;
        }
    }

ID ID是由数据库生成的整数,在调用保存更改之前,没有任何方法可以获取它。可能的解决方案包括:

  • 触发器
  • 使用GUIDS作为主要密钥
  • 使用数据库(NHIBERNATE中的Hilo)不管理的关键生成策略
  • 首先调用base.savechanges()然后检查结果。

我建议在数据库级别使用存储过程执行您的插入/审核功能(以及其他数据库更改),并撤销从用户的插入/更新/删除权限。因此,您可以保证更新过程和审核表的完整性。

相关内容

  • 没有找到相关文章

最新更新