Изменения модели репозитория Entity Framework и саг Masstransit
Я играл с образцом masstransit отсюда https://github.com/MassTransit/Sample-ShoppingWeb Несмотря на то, что я обновился до последней версии (3.3.5) masstransit, и все работает отлично.
Я хочу добавить 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 ответ
Постоянство Saga просто сохраняет ваши объекты экземпляров саги в некоторых таблицах в соответствии с вашим отображением. Вы можете использовать собственные инструменты обновления схемы слоя постоянства, чтобы исправить это. Я не думаю, что это имеет какое-либо отношение к MassTransit. Для EF вы можете использовать EF с миграцией кода. Для NH вы можете использовать встроенную схему обновления. Для баз данных документов, таких как MondoDb или RavenDb, вы просто ничего не делаете.
В любом случае, думайте об этом как о обычной задаче изменения схемы базы данных. Вы должны приложить некоторые усилия, как при любом другом изменении схемы базы данных. Например, вам нужно учесть миграции, необходимые для исправления существующей саги при обновлении схемы. Как и для любого другого изменения схемы, вам понадобится несколько скриптов или кода, чтобы это исправить. То же самое относится и к базам данных документов, хотя вам не нужно иметь скрипты обновления кода или код для каждого изменения, но по крайней мере для тех, которые требуют изменения существующих саговых документов.