如何获取标识列的主键

时间:2012-06-23 20:12:58

标签: asp.net-mvc-3 entity-framework

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

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

在代码示例中,他们使用GUID作为主键。在我的情况下,我使用自动增量的标识列。上面链接中的代码工作得很好,除了'add'我在调用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;
        }

1 个答案:

答案 0 :(得分:2)

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