1

次のコードを使用して、MVC3アプリで監査証跡を作成しています。

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

コードサンプルでは、​​主キーに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;
        }
4

1 に答える 1

2

データベースで生成されたPKを使用して1回の実行でそれを行うことはできません。これが、投稿でGUIDが使用される理由です。挿入されるレコードのPKは、挿入後=実行後のみにわかりますSaveChanges。したがって、その後、何度も挿入ログを作成する必要がありますSaveChanges

于 2012-06-23T23:04:30.823 に答える