0

データベースのすべてのテーブルには、最後に 2 つの列があり、ログを記録できます (アクションを実行したユーザーとアクションの日付)。編集:コードファーストの移行を使用します。
したがって、これらの 2 つのログ列が自動的に入力されるようにしたいと思います。

  1. テーブルに新しいエントリを挿入するたびに (DbContext.[Model].Add(entry) を使用)

  2. または、DbContext.SaveChanges() アクションを実行するたびに


DbContext.SaveChanges() メソッドをオーバーライドすることを検討しましたが、うまくいきませんでした...

また、DbSet Add() メソッドをオーバーライドして、そこでログ入力アクションを実行しようとしました。そのために、 DbSet から継承する CustomDbSet クラスを作成しました。

public class CustomDbSet<TEntity> : DbSet<TEntity> where TEntity : class
    {
        public TEntity Add(TEntity entity)
        {
            //Do logging action here
            return base.Add(entity);
        }
    }

しかし、これもうまくいきませんでした。
EDIT:このCustomDbSetで何が起こるかというと、DbContext.[Model]がnullを返すということです(データベーステーブルのコンテンツで満たされるので

はなく)ロギングが「自動」アクションになるように、どこに置くかを知っています..

public static void EntityLogCreate<T>(this T model, string userName) where T : LogColumns
{
    model.Create_User = userName;
    model.Create_Date = DateTime.Now;
}

それを達成するためのアイデアはありますか?

4

1 に答える 1

0

これを行う方法の例を次に示します。

public class AppContext : DbContext
{
    public DbSet<Item> Items { get; set; }
    public override int SaveChanges()
    {
        int actionById = 1; // Need a way to get the user who does the action.
        DateTime actionDate = DateTime.Now;
        var entries = ChangeTracker.Entries<IAuditLog>();
        foreach (var entry in entries)
        {
            if (entry.State != EntityState.Added && entry.State != EntityState.Modified) continue;
            // Only added and modified entries.
            entry.Entity.ActionById = actionById;
            entry.Entity.ActionDate = actionDate;
        }
        return base.SaveChanges();
    }
}
public interface IAuditLog
{
    int? ActionById { get; set; }
    DateTime? ActionDate { get; set; }
}
public class Item : IAuditLog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ActionById { get; set; }
    public DateTime? ActionDate { get; set; }
}
于 2014-07-31T08:49:58.303 に答える