NServiceBus SagaData与NHibernate在List <string> </string>周围的持久性问题

时间:2013-08-15 13:35:00

标签: nservicebus saga

我在尝试存储此sagadata时遇到错误,因为List也是如此。一旦我删除此列表,它就可以存储数据。

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<string> SupplementCodes { get; set; }

1 个答案:

答案 0 :(得分:1)

自从我使用NHibernate进行传奇存储以来已经很长时间了 - 这正是我不喜欢它的原因!在NServiceBus 2.0期间,我写了my own saga handler that uses XML serialization instead。作为文档数据库的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列必须为虚拟才能使自动化生效。 (感谢Andreas的评论!)

替代方法

如果您的saga数据被分割成多个这样的表,那么对于saga数据的争用可能是NHibernate的一个主要问题,因为数据库现在必须在多个表上持有锁。

“SupplementCodes”听起来像是非常基本的东西。如果您可以更改您的传奇存储以在一个字符串中使用逗号分隔列表,那么NHiberante将能够将其存储在一个表中,并且从性能和锁定角度来看,您可能会更好。