我有一个有 3 个状态的传奇 -
public static State Initial { get; set; }
public static State ReceivingRows { get; set; }
public static State Completed { get; set; }
当它收到 BofMessage(其中 Bof = 文件开头)时,它从 Initial 转换为 ReceivingRows。在 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 平方性能。使用 NProf 进行调查显示,每行添加都会导致整个行列表为:
a) 从数据库中选择
B) 从数据库中删除
C) 重新插入数据库。
这对我来说似乎是非常糟糕的行为。添加一行所需要做的就是……好吧,向数据库中添加一行!添加操作实际上是我对行列表所做的唯一事情。当我们在列表中有 10,000 个项目时,这不会扩展。
有谁知道如何让这个传奇更加理智的表现行为?
顺便说一句-如果需要,这是 IList 的映射方式-
HasMany(x => x.Rows)
.Table("OwnerHistorySagaRow")
.KeyColumn("CorrelationId")
.Element("Row")
.Cascade.AllDeleteOrphan();
谢谢!