我一直在玩这里的masstransit样本https://github.com/MassTransit/Sample-ShoppingWeb 尽管我已经更新到masstransit的最新版本(3.3.5),一切正常。
我想将ShoppingCartItems添加到我的ShoppingCart中,所以我将它添加到模型和这样的映射。
public class ShoppingCartMap :
SagaClassMapping<ShoppingCart>
{
public ShoppingCartMap()
{
Property(x => x.CurrentState)
.HasMaxLength(64);
Property(x => x.Created);
Property(x => x.Updated);
Property(x => x.UserName)
.HasMaxLength(256);
Property(x => x.ExpirationId);
Property(x => x.OrderId);
HasMany(c => c.ShoppingCartItems);
}
}
public class ShoppingCart :
SagaStateMachineInstance
{
public string CurrentState { get; set; }
public string UserName { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
/// <summary>
/// The expiration tag for the shopping cart, which is scheduled whenever
/// the cart is updated
/// </summary>
public Guid? ExpirationId { get; set; }
public Guid? OrderId { get; set; }
public Guid CorrelationId { get; set; }
public virtual List<ShoppingCartItem> ShoppingCartItems { get; set; } = new List<ShoppingCartItem>();
}
public class ShoppingCartItem
{
public Guid? Id { get; set; }
public string Name { get; set; }
public Guid? OrderId { get; set; }
}
这是在启动时运行的:
SagaDbContextFactory sagaDbContextFactory =
() => new SagaDbContext<ShoppingCart, ShoppingCartMap>(SagaDbContextFactoryProvider.ConnectionString);
_repository = new Lazy<ISagaRepository<ShoppingCart>>(
() => new EntityFrameworkSagaRepository<ShoppingCart>(sagaDbContextFactory));
我得到的问题是一条错误消息,说明模型已更改。如果我删除数据库并从头开始运行解决方案它可以工作,但我不想在每次需要在我的传奇类中进行更改时删除整个数据库。
我的计划是通过传奇构建我的ShoppingCart,当我到达完成状态时,我将使用传奇上下文(ShoppingCart)来创建和保持真实订单。也许我错过了这一切并且误解了整个传奇的概念?如果是这样,怎么会有关于具有复杂对象图的传奇呢?
答案 0 :(得分:1)
Saga持久性只是根据您的映射将您的saga实例对象保存到某些表中。您可以使用持久层自己的架构更新工具来解决此问题。我不认为这与MassTransit有任何关系。对于EF,您可以使用EF代码优先迁移。对于NH,您可以使用内置架构更新。对于像MondoDb或RavenDb这样的文档数据库,你什么都不做。
在任何情况下,请将此视为正常的数据库架构更改任务。您必须像在任何其他数据库架构更改中那样付出一些努力。例如,您需要考虑在更新架构时修复现有传奇所需的迁移。对于任何其他架构更改,您需要使用一些脚本或代码来解决此问题。这同样适用于文档数据库,尽管您不需要为每个更改都有架构更新脚本或代码,但至少对于那些需要更改现有传奇文档的人来说。