Masstransit sagas和Entity Framework存储库模型更改

时间:2016-07-10 14:36:13

标签: entity-framework masstransit saga

我一直在玩这里的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)来创建和保持真实订单。也许我错过了这一切并且误解了整个传奇的概念?如果是这样,怎么会有关于具有复杂对象图的传奇呢?

1 个答案:

答案 0 :(得分:1)

Saga持久性只是根据您的映射将您的saga实例对象保存到某些表中。您可以使用持久层自己的架构更新工具来解决此问题。我不认为这与MassTransit有任何关系。对于EF,您可以使用EF代码优先迁移。对于NH,您可以使用内置架构更新。对于像MondoDb或RavenDb这样的文档数据库,你什么都不做。

在任何情况下,请将此视为正常的数据库架构更改任务。您必须像在任何其他数据库架构更改中那样付出一些努力。例如,您需要考虑在更新架构时修复现有传奇所需的迁移。对于任何其他架构更改,您需要使用一些脚本或代码来解决此问题。这同样适用于文档数据库,尽管您不需要为每个更改都有架构更新脚本或代码,但至少对于那些需要更改现有传奇文档的人来说。