2016-07-10 20 views
0

Ich habe mit dem massttransit Probe von hier gespielt https://github.com/MassTransit/Sample-ShoppingWeb Obwohl ich auf die neueste Version (3.3.5) von massttransit aktualisiert haben und alles funktioniert gut.Masstransit sagas und Entity Framework Repository Modelländerungen

Ich möchte ShoppingCartItems zu meinem ShoppingCart hinzufügen, also habe ich es dem Modell und dem Mapping so hinzugefügt. Diese

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; } 
} 

wird beim Start ausgeführt wird:

SagaDbContextFactory sagaDbContextFactory = 
       () => new SagaDbContext<ShoppingCart, ShoppingCartMap>(SagaDbContextFactoryProvider.ConnectionString); 

      _repository = new Lazy<ISagaRepository<ShoppingCart>>(
       () => new EntityFrameworkSagaRepository<ShoppingCart>(sagaDbContextFactory)); 

Das Problem, das ich bekommen eine Fehlermeldung, das Modell geändert hat. Wenn ich die Datenbank lösche und die Lösung von Grund auf neu starte, funktioniert es, aber ich möchte nicht immer meine gesamte DB löschen, wenn ich eine Änderung in meiner Sagaklasse machen muss.

Mein Plan ist, mein ShoppingCart durch die Saga zu bauen, und wenn ich meinen fertigen Zustand erreiche, werde ich den Saga-Kontext (ShoppingCart) verwenden, um reale Aufträge zu erstellen und aufrechtzuerhalten. Vielleicht mache ich das alles falsch und habe das ganze Konzept der Sagas missverstanden? Wenn ja, wie würde man über Sagen mit komplexen Objektgraphen verfahren?

Antwort

1

Saga-Persistenz speichert nur Ihre Saga-Instanzobjekte in einigen Tabellen, entsprechend Ihrer Zuordnung. Sie können die eigenen Schema-Update-Tools Ihrer Persistenzschicht verwenden, um dies zu beheben. Ich glaube nicht, dass dies etwas mit MassTransit zu tun hat. Für EF können Sie EF-Code-First-Migrationen verwenden. Für NH können Sie das integrierte Schema-Update verwenden. Für Dokumentendatenbanken wie MondoDb oder RavenDb tun Sie einfach nichts.

In jedem Fall, denken Sie darüber als eine normale Datenbank Schema Change Task. Sie müssen sich etwas Mühe geben wie bei jeder anderen Änderung des Datenbankschemas. Beispielsweise müssen Sie Migrationen berücksichtigen, die erforderlich sind, um Ihre vorhandene Saga beim Aktualisieren des Schemas zu korrigieren. Wie bei jeder anderen Schemaänderung benötigen Sie einige Skripte oder Code, um dies zu beheben. Dasselbe gilt auch für Dokumentendatenbanken, obwohl Sie für jede Änderung keine Schemaaktualisierungsskripts oder -codes benötigen, aber zumindest für diejenigen, die vorhandene Saga-Dokumente ändern müssen.