3

次のような多対多の関係を持つレガシー データベースがあります。

    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 テクニックはありますか?

(繰り返しますが、これは従来のデータベースであり、変更するためにできることはほとんどないため、データベースにストアド プロシージャやその他のロジックを追加することは避けたいと思います。)

御時間ありがとうございます!

4

2 に答える 2

0

患者:「先生、これをすると痛いです。治す方法はありますか?」医者:「そうしないでください。」

「答えはない」として、私自身の質問に答えます。関連する StackOverflow の質問に関するコメントで他の人がアドバイスしているのを見たので、最終的には「リンク」エンティティを明示的にモデルに含める方が良いと思います。

于 2013-06-13T16:37:12.773 に答える
0

したがって、これを正しく理解していれば、アイテムをコレクションの 1 つに追加してエンティティを保存するときに、多対多テーブルに CreatedBy フィールドを設定する必要があります。DbContext.Database.SqlCommand を使用して生の SQL を実行し、リンク テーブルの監査フィールドを更新できます。生のSQLを実行する方法

では、変更を傍受するにはどうすればよいでしょうか。

これらの回答が役立つ場合があります: EF4 Audit changes of many to many relationshipsおよびEntity Framework: Tracking changes to FK associations

編集:

参考までに、私が投稿した元の例を次に示します。これにより、SQL をモデルに組み込む必要があると思われるようになった可能性があります。

于 2013-06-07T08:58:08.693 に答える