2017-09-21 2 views
1

S'il vous plaît voir le code ci-dessous, que j'emprunté un tutoriel en ligne CQRS:Comment partager des tables dans des contextes?

public class OrderReadContext: DbContext 
    { 
     public OrderReadContext() : base("name=GeekStuffSales") { 

     } 
     public DbSet<SalesOrder> Orders { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     modelBuilder.HasDefaultSchema("Order"); 
    } 
    } 
    public class OrderSystemContextConfig : DbConfiguration 
    { 
    public OrderSystemContextConfig() { 
     SetDatabaseInitializer(new NullDatabaseInitializer<OrderReadContext>()); 
    } 

    } 

et:

public class OrderWriteContext : DbContext 
    { 
    public OrderWriteContext() : base("name=GeekStuffSales") 
    { 
    } 

    public DbSet<SalesOrder> Orders { get; set; } 
    public DbSet<LineItem> LineItems { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("Order"); 
     modelBuilder.Entity<SalesOrder>().Ignore(s => s.LineItems); 
    } 
    } 

    public class OrderSystemContextConfig : DbConfiguration 
    { 
    public OrderSystemContextConfig() 
    { 
     SetDatabaseInitializer(new NullDatabaseInitializer<OrderWriteContext>()); 
    } 
    } 

Si je OrderReadContext premier exemple en utilisant GetByID, puis les erreurs OrderWriteContext la première fois qu'il est utilisé en disant: "Sales Order existe déjà". Si j'utilise OrderWriteContext en premier, par exemple en utilisant InsertSalesOrder, puis les erreurs OrderReadContext la première fois qu'il est utilisé en disant: "Sales Order existe déjà".

Je comprends ce qui se passe ici, c'est-à-dire que vous ne pouvez pas créer deux fois la même table. Je veux juste créer une table de base de données à utiliser par ces deux contextes. Comment puis-je faire cela?

Répondre

2

Étant donné que cette question est étiquetée avec CQRS et la conception de domaine, je répondrai de cette perspective. Dans une application CQRS typique, les bases de données en lecture et en écriture seraient séparées. Et même s'ils résidaient dans la même instance de base de données, les tables seraient séparées. Cela est dû au fait que les schémas côté lecture et écriture sont susceptibles d'être différents et de changer au cours du cycle de vie de l'application.

Si tel était le cas, vous éviterez complètement ce problème.

Si vous le trouvez utile, ce diagramme et cette explication donnent une architecture conceptuelle raisonnable pour une application CQRS typique. CQRS + Event Sourcing – A Step by Step Overview

J'espère que vous trouverez cela utile.

+0

Merci. J'entends ce que vous dites pour ce +1. Cependant, comment testeriez-vous une application CQRS avec deux localdbs? Par exemple, si vous insérez des enregistrements dans la base de données d'écriture, vous ne les trouverez pas dans la base de données en lecture car la réplication n'est pas configurée. – w0051977

+0

Je n'utiliserais pas la réplication car les deux bases de données sont susceptibles d'être différentes. Le côté lecture est susceptible d'être dénormalisé et concentré sur la vitesse de lecture. La base de données de domaine peut même ne pas être dans des tables. Concernant le test: vous testez les éléments du domaine séparément du côté lecture. Vous pouvez créer des tests d'intégration, mais cela nécessiterait plus d'espace que ce que j'ai ici pour expliquer. – Codescribler

+0

Mon plan est d'utiliser SQL Server pour l'écriture et NoSQL pour la lecture. Cependant, pour tester, j'aurai deux LocalDBs qui sont SQL Server. En l'état (en utilisant votre approche), je vais entrer des informations dans la base de données d'écriture et il ne sera pas disponible pour sélectionner à partir de la lecture. Cela a-t-il du sens? – w0051977

0

Exécutez les migrations (et update-database) séparément pour les deux contextes. Voici un exemple de la façon de travailler avec plusieurs contextes: