0

追加\変更されたすべてのレコードに、作成\変更のタイムスタンプが付けられるようにします。

しかし、組み込みや管理が容易になるため、自動化されます。

4

1 に答える 1

1

「DbContext」クラスを上書きするか、これを「.tt」ファイルに埋め込みます (Codefirst \ DBFirst)

コードは、POCO 内にフィールド 'CreatedOn'\'ModifiedOn' があることを前提としています。

それらを持っていない場合、または 1 つしか持っていない場合、コードは正常に機能します。

注意してください!拡張機能を (このように) 使用する場合、ストアド プロシージャからバッチ更新または変更を行うことができます - これは機能しません

編集:

私はインスピレーションの源を見つけました -ここで「ニック」に感謝します

public override int SaveChanges()
{
    var context = ((IObjectContextAdapter)this).ObjectContext;
    var currentTime = DateTime.Now;
    var objectStateEntries = from v in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
                                where v.IsRelationship == false && v.Entity != null
                                select v;

    foreach (var entry in objectStateEntries)
    {
        var createdOnProp = entry.Entity.GetType().GetProperty("CreatedOn");
        if (createdOnProp != null)
        {
            if (entry.State == EntityState.Added)
            {
                if (createdOnProp != null)
                {
                    createdOnProp.SetValue(entry.Entity, currentTime);
                }
            }
            else
            {
                Entry(entry.Entity).Property("CreatedOn").IsModified = false;
            }
        }

        var modifiedOnProp = entry.Entity.GetType().GetProperty("ModifiedOn");
        if (modifiedOnProp != null)
        {
            modifiedOnProp.SetValue(entry.Entity, currentTime);
        }
    }

    return base.SaveChanges();
}
于 2013-07-24T15:44:46.313 に答える