2

私は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();

ありがとうございました!

4

2 に答える 2

3

これが死んだアイテムであることは知っていますが、バッグを適切に機能させるための本当の答えは次のとおりです.

Bag(x => x.Rows, c =>
{
    c.Key(k =>
    {
        k.Column("RowCorrelationId");
        k.ForeignKey("FK_State_Row");
        k.NotNullable(true);
    });
    c.Fetch(CollectionFetchMode.Join);
    c.Lazy(CollectionLazy.NoLazy);
    c.Cascade(Cascade.All);
}, r => r.OneToMany());

のクラス タイプはRowsですIList<Row>

于 2015-02-25T15:29:10.100 に答える