次のコードを使用して、MVC3アプリで監査証跡を作成しています。
コードサンプルでは、主キーにGUIDを使用しています。私の場合、自動インクリメントするID列を使用しています。上記のリンクのコードは、dbentry.current値を呼び出すときに'add'を除いて、主キーを取得できません(forはこのデータを送信しないため0を返します)。
トランザクションテーブルに適切に追加できるように、主キーを取得する方法を見つけようとしています。後でこれを取得できることは知っていますが、それを取得して正しい主キーでテーブルを更新する最善の方法がわかりません。
任意のアイデアをいただければ幸いです。主キーをGUIDに変更したくない。
動作するdbcontextに次の変更を加えました。
if (ent.State == System.Data.EntityState.Added)
{
base.SaveChanges();
ent.State = System.Data.EntityState.Added;
}
次に、GetAuditRecordsForChange関数で、レコードが2回作成されないように、再度デタッチしました。
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;
}