我有一个有 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 都描述平面文件中的一行。发送所有 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();
谢谢!
最佳答案
我知道这是一个死项目,但这是让包正常工作的真正答案。
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>
.
关于nhibernate - 如何确保使用 MassTransit Saga 将项目添加到 NHibernate 持久化 IList 的良好性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708451/