簡體   English   中英

在調用 SaveChanges() 之前添加實體的訪問 id

[英]access id of added entity before SaveChanges() is called

我正在使用 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;
        }
    }

Id Id 是數據庫生成的整數,在調​​用保存更改之前沒有任何方法可以獲取它。 可能的解決方案包括:

  • 觸發器
  • 使用 Guid 作為主鍵
  • 使用不受數據庫管理的密鑰生成策略(NHibernate 中的 HiLo)
  • 首先調用 base.SaveChanges() 然后檢查結果。

我建議在數據庫級別使用存儲過程來執行插入/審核功能(和其他數據庫更改),並撤銷用戶的插入/更新/刪除權限。 因此,您可以保證更新過程和審計表的完整性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM