EntityFrameworkCore多个PG Schema上的DBContext相同

时间:2017-09-14 15:19:43

标签: c# postgresql entity-framework database-schema

我想了解在多个Postgres Schema上使用相同的DBContext是否是一个有效的架构。

为了清楚起见,我想运行我的应用程序的多个实例,并使用appsettings.json中的配置参数创建DBContext On Model Creating,以便跨不同的模式隔离不同应用程序的数据。 / p>

1 个答案:

答案 0 :(得分:0)

修改

好的,让我改进我的答案(记住我这样做是为了在同一个应用程序中遇到两个不同的数据库,在你的情况下它将是同一个数据库)

如果您尝试与同一数据库中的其他用户连接以仅访问用户可以访问的内容,则必须放置不同的连接字符串 所以你应该使用一些东西来识别使用哪一个,在我的例子中我在我的设置文件中使用一个变量,如下所示:

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) 
    {
        ........
    }

}

现在OnModelCreating示例

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


    .....
}

在选择使用哪种类型的数据库时,它适用于我,PostgreSql或SqlServer

您的DataBaseContext变量必须包含要根据您的要求使用的连接名称

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

看到我在postgres用户的一个连接字符串中为PostgreSql放了两个条目,为UserA提供了一个条目

我不知道这是否解决了你的问题,但它肯定可以在同一个应用程序中选择PostgreSql和SqlServer,只需通知app.Config(或Web.Config)将使用哪个连接以及哪种类型的数据

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