1

我正在使用以下代码在 MVC3 应用程序中创建审计跟踪。

http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit-logging/

在代码示例中,他们使用 GUID 作为主键。就我而言,我使用的是自动递增的标识列。上面链接中的代码效果很好,除了在“添加”上调用 dbentry.current 值时我无法获取主键(返回 0,因为 for 不提交此数据)。

我正在尝试找到一种获取主键的方法,以便可以正确地将其添加到我的事务表中。我知道您以后可以检索它,但我不确定获得它然后使用正确的主键更新表的最佳方法。

任何想法,将不胜感激。我不想将我的主键更改为 GUID。

我对有效的 dbcontext 进行了以下修改。

if (ent.State == System.Data.EntityState.Added)
            {
                base.SaveChanges();
                ent.State = System.Data.EntityState.Added;
            }

然后在 GetAuditRecordsForChange 函数中,我再次分离,因此不会创建两次记录。

if (dbEntry.State == System.Data.EntityState.Added)
        {
            // For Inserts, just add the whole record
            // If the entity implements IDescribableEntity, use the description from Describe(), otherwise use ToString()                   
            result.Add(new TransactionHistory()
            {
                TransactionTypeID = 1,
                TableName = tableName,
                FieldName = "ALL",
                RecordPK = dbEntry.CurrentValues.GetValue<object>(keyName).ToString(),
                OldValue = null,
                NewValue = (dbEntry.CurrentValues.ToObject() is IDescribableEntity) ? (dbEntry.CurrentValues.ToObject() as IDescribableEntity).Describe() : dbEntry.CurrentValues.ToObject().ToString(),
                TransactionBy = userId,
                TransactionDate = changeTime,
                TransactionApplication = "Galactus"
            });
            dbEntry.State = System.Data.EntityState.Detached;
        }
4

1 回答 1

2

您不能使用数据库生成的 PK 在单次运行中执行此操作。这就是帖子使用 GUID 的原因。要插入的记录的 PK 只有在插入之后才知道 = 在您执行之后SaveChanges。因此,您需要在此之后SaveChanges一次又一次地构建您的插入日志。

于 2012-06-23T23:04:30.823 回答