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