2012-06-23 4 views
1

Я использую следующий код для создания контрольного журнала в приложении MVC3.Как получить первичный ключ для столбца идентификации

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

В примере кода они используют GUIDs для первичных ключей. В моем случае я использую столбцы Identity, которые автоматически увеличиваются. Код в приведенной выше ссылке отлично работает, за исключением «add». Я не могу получить первичный ключ (return 0, поскольку for не передает эти данные) при вызове значений dbentry.current.

Я пытаюсь найти способ получить первичный ключ, чтобы я мог правильно добавить его в таблицу транзакций. Я знаю, что вы можете получить это после, но я не уверен, что лучший способ получить это, а затем обновить таблицу с помощью правильного первичного ключа.

Любые идеи будут оценены. Я бы предпочел не менять мои первичные ключи на 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; 
     } 

ответ

2

Вы не можете сделать это за один проход с созданной базой данных PK. Вот почему почта использует GUID. PK записи, которая будет вставлена, известна только после вставки = после выполнения SaveChanges. Поэтому вам нужно построить свой журнал вставки после этого и снова SaveChanges.

+0

Спасибо, я сделал пару небольших изменений, которые работают. Если состояние объекта добавлено, я делаю изменения сохранения, а затем снова добавляю состояние, чтобы логика продолжала работать для функции аудита, но отсоединяться после добавления аудита. Это, кажется, работает нормально. – Jeff

Смежные вопросы