2017-09-14 4 views
0

Je voudrais comprendre si avoir le même DBContext sur plusieurs Postgres Schema est une architecture valide. Pour être clair, je voudrais exécuter plusieurs instances de mon application et laisser le DBContext sur la création de modèle en utilisant un paramètre de configuration de appsettings.json pour séparer les données pour l'application différente entre différents schémas.EntityFrameworkCore même DBContext sur plusieurs PG Schema

+0

C'est tout à fait valable, mais je vous recommande un DbContext par 'database' pour la séparation des préoccupations –

+0

en supposant que les schémas ont des points communs, bien sûr pourquoi pas? Mais si les schémas sont complètement différents, je ne vois pas l'intérêt de le faire. –

+0

Le point est .... nous devons simuler un système multi-locataire sur la même base de données mais en utilisant différents schémas ... –

Répondre

0

modifier

Ok, laissez-moi améliorer ma réponse (se souvenant que je l'ai fait de rencontrer deux bases de données distinctes dans la même application, dans votre cas, il sera la même base de données)

si vous essayez pour se connecter avec un utilisateur différent dans la même base de données pour accéder uniquement à ce que l'utilisateur peut accéder, vous devrez mettre différentes chaînes de connexion de sorte que vous devez utiliser quelque chose pour identifier lequel utiliser, dans mon cas j'utilise une variable dans mon fichier de paramètres , comme ceci:

public class MyDbContext: DbContext 
{ 

    #region ..:: Fields ::.. 

    private static readonly string DataBaseContext = ConfigurationManager.AppSettings["DataBaseContext"]; 

    #endregion 

    #region ..:: Construtor ::.. 

    public MyDbContext() 
     : base(DataBaseContext) 
    { 
     //Database.CreateIfNotExists(); 
    } 

    #endregion 

    .......... 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     ........ 
    } 

} 

maintenant OnModelCreating exemple

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    #region ..:: Definições ::.. 

    var tipoBancoDados = ConfigurationManager.AppSettings["TipoBancoDados"]; 
    var mySchema = ConfigurationManager.AppSettings["mySchema"]; 

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    modelBuilder.HasDefaultSchema(tipoBancoDados.Contains("PostgreSql") ? "public" : "dbo"); 
    //modelBuilder.HasDefaultSchema(mySchema); 

    #endregion 


    ..... 
} 

Il travaille pour moi au moment de choisir quel type de base de données à utiliser, PostgreSql ou SqlServer

votre variable DataBaseContext doit contenir le nom de la connexion à utiliser, selon vos besoins

<connectionStrings> 
    <add name="PgSqlAdmin" connectionString="SERVER=X.X.X.X;UID=postgres;PWD=PGPASSOWRD;PORT=5432;DATABASE=mydatabase;" providerName="Npgsql" /> 
    <add name="PgSqlUserA" connectionString="SERVER=X.X.X.X;UID=UserA;PWD=PGPASSOWRD;PORT=5432;DATABASE=mydatabase;" providerName="Npgsql" /> 
    <add name="RemoteDb" connectionString="Data Source=X.X.X.X;Initial Catalog=MyDataBase;MultipleActiveResultSets=True;User Id=sa;Password=SqlServerPassword" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

voir que je mets deux entrées pour PostgreSql dans les chaînes de connexions un pour l'utilisateur postgres et un pour UserA

Je ne sais pas si cela résout votre problème, mais il est sûr de choisir entre PostgreSQL et SqlServer dans la même application, il suffit d'informer l'app.Config (ou Web.Config) quelle connexion sera utilisée et quel type de données

<appSettings> 
    <!--Usar: PostgreSql | SqlServer --> 
    <add key="TipoBancoDados" value="PostgreSql" /> 
    <add key="DataBaseContext" value="PgSqlAdmin" /> 
</appSettings> 
+0

mhmm non ce n'est pas ce que j'ai demandé! Merci quand même pour la réponse! –