19

データベース内の多くのテーブルには、"DateCreated" および "DateModified" 列が必要です。SaveChanges()が呼び出されるたびにこれらの列を更新したいと考えています。

すべてのモデル オブジェクトはクラスから継承してAbstractModel、この種の動作を可能にします。クラスは次のようになります。

public abstract class AbstractModel {
    public virtual void UpdateDates() { }
}

次に、保持する必要があるフィールドを持つ子UpdateDates()クラスをオーバーライドする予定です。DateCreatedDateModified

DbContextこれを使用するには、が追跡しているすべてのエンティティのリストを取得し、オブジェクトがまたはUpdateDates()であるとマークされている場合はそれらを呼び出すことができる必要があります。AddedModified

DbContextこの情報が保存されている場所にアクセスできないようです。dbContext.Entry(object).State単一のエンティティのを取得することはできますEntityStateが、追跡されたすべてのエンティティのリストを取得する方法がわかりません。

どうすればいいですか?

4

3 に答える 3

31

これにはChangeTrackerを使用できると思います:

public class MyContext : DbContext
{
    //...

    public override int SaveChanges()
    {
        foreach (var dbEntityEntry in ChangeTracker.Entries<AbstractModel>())
        {
            dbEntityEntry.Entity.UpdateDates();
        }
        return base.SaveChanges();

    }
}
于 2012-04-12T11:28:08.780 に答える
2

これは私たちのプロジェクトでうまく機能しているので、標準の LastUpdatedDateTime プロパティを持つ新しいエンティティを追加するたびに何かをオーバーライドすることを覚えておく必要はありません。EF4 の使用。EF5 DbContext の場合、 ((IObjectContextAdapter)_dbContext).ObjectContext.ObjectStateManager はオブジェクト状態マネージャーを取得すると思います。

// In our SaveChanges wrapper:
        var entries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted);

        private static void PopulateDate(IEnumerable<ObjectStateEntry> entries)
                {
                    foreach (var entry in entries)
                    {
                        if (entry.State != EntityState.Deleted)
                        {
                            if ((entry.Entity != null) && (entry.Entity.GetType().GetProperty("LastUpdatedDateTime") != null))
                            {
                                ((dynamic)entry.Entity).LastUpdatedDateTime = DateTime.UtcNow;
                            }
                        }
                    }
                }

リフレクション コールは問題ではありません。25 個のプロパティ (大量) を持つオブジェクトの場合、100 万回のリフレクション クエリには平均で約 210 ミリ秒かかります。

于 2012-12-06T20:54:34.400 に答える