次のような多対多の関係を持つレガシー データベースがあります。
public class Post
{
public ICollection<Tag> Tags { get; set; }
...
}
public class Tag
{
public ICollection<Post> Posts { get; set; }
...
}
「PostTagLink」テーブルで追跡される多対多の関係を使用します。
通常、Code First を使用して、多対多の関係を多かれ少なかれ暗黙的に表現するのは簡単です。つまり、関係が追加または削除されたときに「PostTagLink」テーブルを更新しますが、実際には「PostTagLink」エンティティを明示的に定義する必要はありません。
タグと投稿の監査フィールドは、変更が保存されたときに DbContext によって簡単に更新できます。
public abstract class MyAuditableEntityContext : DbContext
{
public override int SaveChanges()
{
string currentUser = Thread.CurrentPrincipal.Identity.Name;
foreach (DbEntityEntry<IAuditableEntity> changeEntry in base.ChangeTracker.Entries<IAuditableEntity>())
{
if (changeEntry.State == EntityState.Added)
{
changeEntry.Entity.CreatedBy = currentUser;
changeEntry.Entity.RevisedBy = currentUser;
}
else if (changeEntry.State == EntityState.Modified)
{
changeEntry.Entity.RevisedBy = currentUser;
}
}
return base.SaveChanges();
}
}
しかし、「PostTagLink」テーブルにも監査フィールドが含まれている場合はどうなるでしょうか?
私が見ることができる唯一の解決策は、モデルに PostTagLink エンティティを含めることです (Tag と Post に戻る多対 1 の関係を持つ)。これにより、DbContext の SaveChanges メソッドで監査フィールドにアクセスできます。
しかし、これらの余分なエンティティを追加すると、モデルの操作が厄介になります。クライアントとクエリは、エンティティ フレームワークが関係の変更を自動的に処理する代わりに、「リンク」エンティティを直接処理する必要があります。
質問: モデルに「リンク」エンティティを明示的に含めることなく、多対多の関係への変更をインターセプトし、必要に応じてリンク テーブルの監査フィールドを更新できる、Entity-Framework-ninja テクニックはありますか?
(繰り返しますが、これは従来のデータベースであり、変更するためにできることはほとんどないため、データベースにストアド プロシージャやその他のロジックを追加することは避けたいと思います。)
御時間ありがとうございます!