SaveChanges()
オブジェクトのメソッドをオーバーライドして、DbContext
監査プロパティの値を更新できることは知っています。しかし、実際にエンティティにマッピングせずに監査列を更新したい場合はどうなりますか?
「更新する列」リストに余分なマップされていない列の値を含めるように Entity Framework に指示する方法はありますか?
ありがとう!
SaveChanges()
オブジェクトのメソッドをオーバーライドして、DbContext
監査プロパティの値を更新できることは知っています。しかし、実際にエンティティにマッピングせずに監査列を更新したい場合はどうなりますか?
「更新する列」リストに余分なマップされていない列の値を含めるように Entity Framework に指示する方法はありますか?
ありがとう!
うーん...監査にとらわれない...では、フィールドがそもそもそこにあるかどうかわかりませんか? それとも、フィールドが設定されているかどうか気にしないということですか?
後で列を追加するだけで不要にすることができますか? 私は個人的に、継承を介してほとんどのエンティティに CreatedDate、CreatedBy、ModifiedDate、ModifiedBy を追加します。IE では、次のような AuditableEnity クラスを使用できます。
public class AuditableEnity
{
public int? CreatedById { get; set; }
[Display(Name = "Created Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy H:mm}")]
public DateTime? CreatedDate { get; set; }
public int? ModifiedById { get; set; }
[Display(Name = "Modified Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy H:mm}")]
public DateTime? ModifiedDate { get; set; }
}
そうすれば、定型的なプロパティですべてのモデルを台無しにする必要はありません。その後、少しだけ追加します。
次に、SaveChanges() は次のようになります。
public override int SaveChanges()
{
//Only get changes from the auditable entities
var changeSet = ChangeTracker.Entries<AuditableEnity>();
...
if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
if (entry.State == EntityState.Added)
{
if (entry.Entity.OverrideAuditing == false)
{
entry.Entity.CreatedById = userId;
entry.Entity.CreatedDate = DateTime.UtcNow;
}
}
entry.Entity.ModifiedById = userId;
entry.Entity.ModifiedDate = DateTime.UtcNow;
}
}
return base.SaveChanges();
}