0

行が更新される前Postsに、テーブルへのレコード全体の変更を保存して、テーブルを監査したいと考えています。エンティティは、列とともにすべてのエンティティ列を格納する必要があります。PostRevisionsPostPostRevisionPostRevisionId

これを Fluent NHibernate でマッピングしたいと思います。PostRevisionエンティティはエンティティのプロパティをミラーリングする必要がありますがPost、2 つのエンティティ クラスとマッピング クラスを維持する必要はありません。

これを実現するには、エンティティとマッピングをどのように設計すればよいですか?

Post Edit に必要な疑似コード

var post = _unitOfWork.CurrentSession.Get<Post>(id);
var postRevision = new PostRevision(post);

post.Content = "changed value"; // change some things here

_unitOfWork.CurrentSession.Save(post);
_unitOfWork.CurrentSession.Save(postRevision);

_unitOfWork.Commit();

PostRevision構成クラス:

public class PostRevision
{
    public virtual Guid Id { get; private set; }
    public virtual Post Post { get; set; }

    public PostRevision()
    {
    }

    public PostRevision(Post post)
    {
        this.Post = post;
    }
}

流暢なマッピングの可能性:

public class PostRevisionMap : ClassMap<PostRevision>
{
    public PostRevisionMap()
    {
        Id(x => x.Id);
        Component(x => x.Post); // will something like this work?
    }
}
4

1 に答える 1

0

あなたが探している関係 (私が思うに) は 1 対多です: Post には多くの PostRevision があります。
PostRevision は単一の Post を参照します。
したがって、Post 側の正しいマッピングは次のようになると思います

HasMany(x=> x.PostRevisions);  

PostRevision 側では:

References(x=> x.Post).  

これらの関連付けをマッピングする方法の 詳細については、 nHibernate のドキュメントを参照してください。

編集
投稿の各リビジョンの履歴記録を残したい場合は、2 つのオプションがあります。
1. ブール値の「IsHistoric」フィールドを Post クラスに追加します。投稿が改訂されるたびに、Post オブジェクト自体を変更するのではなく、'IsHistoric = true' としてマークし、改訂された Post を表す新しい Post オブジェクトを作成します。これは、私のプロジェクトで使用する方法です。
2. Post から継承する「HistoricPost」クラスを作成します。マッピングを繰り返す必要はなく、このクラスに別のテーブルを使用できます (サブクラスごとのテーブル戦略)。
詳しくはこちらをご覧ください。
を使用して、子クラスに別の Id 列を指定することもできると思いますId(x => x.SomeOtherId);「HistoricPost」のマッピングで。私はそれを試していないので、100%確実ではありません。

于 2011-04-24T23:13:42.697 に答える