自从我使用 NHibernate 进行 saga 存储以来已经有很长时间了——这正是我不喜欢它的原因!在 NServiceBus 2.0 期间,我编写了自己的 saga 处理程序,它改用 XML 序列化。RavenDB 是一个文档数据库,没有任何这些问题。
然而,从内存来看,NHibernate 无法将字符串列表存储在一个表中,因此它需要能够创建第二个表来规范化数据。
如果我们手动创建它,我们将使用 SagaId 和 StringValue 创建一个表并将其命名为 SagaSupplementCode。NHibernate 无法安静地弄清楚如何做到这一点。
如果您创建了这样的东西,我认为 NHibernate 将能够存储它。
public class MySagaData
{
public virtual Guid Id { get; set; }
public virtual string Originator { get; set; }
public virtual string OriginalMessageId { get; set; }
public virtual string TransactionReference { get; set; }
public virtual string CvvNumber { get; set; }
public virtual List<SupplementCode> SupplementCodes { get; set; }
}
public class SupplementCode
{
public virtual Guid Id { get; set; }
public virtual string Code { get; set; }
}
类的添加为 NHibernate 提供了一些基础表名,并与 saga 数据表相关。请注意,您必须有 Id 列,并且它必须是虚拟的才能使自动映射工作。(感谢安德烈亚斯的评论!)
替代方法
如果您的 saga 数据像这样拆分为多个表,那么 saga 数据的争用可能是 NHibernate 的一个主要问题,因为数据库现在必须在多个表上持有锁。
“SupplementCodes”听起来像是相当基本的东西。如果您可以将 saga 存储更改为在一个字符串中使用逗号分隔的列表,那么 NHiberante 将能够将其存储在一个表中,从性能和锁定的角度来看,您可能会更好。