私は3つの状態を持つサガを持っています -
public static State Initial { get; set; }
public static State ReceivingRows { get; set; }
public static State Completed { get; set; }
BofMessage (Bof = ファイルの先頭) を取得すると、Initial から RecomingRows に遷移します。BofMessage の後、多数の RowMessage を受け取ります。それぞれがフラット ファイル内の行を記述しています。すべての RowMessage が送信されると、EofMessage が送信され、状態が Completed に変わります。観察 -
static void DefineSagaBehavior()
{
Initially(When(ReceivedBof)
.Then((saga, message) => saga.BeginFile(message))
.TransitionTo(ReceivingRows));
During(ReceivingRows, When(ReceivedRow)
.Then((saga, message) => saga.AddRow(message)));
During(ReceivingRows, When(ReceivedRowError)
.Then((saga, message) => saga.RowError(message)));
During(ReceivingRows, When(ReceivedEof)
.Then((saga, message) => saga.EndFile(message))
.TransitionTo(Completed));
}
public override void OnAddRow(ParcelRowMessage message)
{
// ensure isCauvReturned is "Y"
var fields = message.Value;
var isCauvReturned = fields[33] == "Y";
if (!isCauvReturned)
return;
// add row with just parcel number
var parcelNumber = fields[1];
var row = parcelNumber;
_rows.Add(row);
}
これは、パフォーマンスが n の 2 乗であることを除けば機能します。NHProf で調査すると、各行が追加されると、行のリスト全体が次のようになることがわかります。
A) データベースから選択
B) データベースから削除
C) データベースに再挿入されます。
これは私には非常に悪い行動のようです。行を追加するために必要なことは、データベースに単一の行を追加することだけです! 追加操作は、文字通り、行リストで行っている唯一のことです。リストに 10,000 個のアイテムがある場合、これはスケーリングしません。
このサガをより健全なパフォーマンス動作にする方法を知っている人はいますか?
ところで-必要に応じてIListをマップする方法は次のとおりです-
HasMany(x => x.Rows)
.Table("OwnerHistorySagaRow")
.KeyColumn("CorrelationId")
.Element("Row")
.Cascade.AllDeleteOrphan();
ありがとうございました!