サガストレージに NHibernate を使用してから長い時間が経ちました。これがまさに、私が気に入らなかった理由です。NServiceBus 2.0 の間、代わりに XML シリアライゼーションを使用する独自の saga ハンドラを作成しました。ドキュメント データベースである RavenDB には、これらの問題はありません。
ただし、メモリから、NHibernate は 1 つのテーブル内に文字列のリストを格納できないため、データを正規化するために 2 つ目のテーブルを作成できる必要があります。
これを手動で作成する場合は、SagaId と StringValue を使用してテーブルを作成し、SagaSupplementCode と呼びます。Hibernate は、これを行う方法を静かに理解することはできません。
このようなものを作成した場合、NHibernate で保存できると思います。
public class MySagaData
{
public virtual Guid Id { get; set; }
public virtual string Originator { get; set; }
public virtual string OriginalMessageId { get; set; }
public virtual string TransactionReference { get; set; }
public virtual string CvvNumber { get; set; }
public virtual List<SupplementCode> SupplementCodes { get; set; }
}
public class SupplementCode
{
public virtual Guid Id { get; set; }
public virtual string Code { get; set; }
}
クラスの追加により、NHibernate はテーブル名の基になる何かを与え、サガ データ テーブルに関連付けます。自動マッピングを機能させるには、ID 列が必要であり、それが仮想である必要があることに注意してください。(コメントありがとうアンドレアス!)
別の方法
サガ データがこのように複数のテーブルに分割された場合、NHibernate ではサガ データの競合が大きな問題になる可能性があります。これは、データベースが複数のテーブルでロックを保持する必要があるためです。
「SupplementCodes」はかなり基本的なもののように聞こえます。1 つの文字列でカンマ区切りのリストを使用するように saga ストレージを変更できれば、NHiberante はそれを 1 つのテーブルに格納できるため、パフォーマンスとロックの観点からはおそらくより良いものになるでしょう。