【问题标题】:EntityFrameworkCore same DBContext on multiple PG Schema多个 PG Schema 上的 EntityFrameworkCore 相同 DBContext
【发布时间】:2017-09-14 15:19:42
【问题描述】:

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

明确地说,我想运行我的应用程序的多个实例,并使用 appsettings.json 中的配置参数创建模型上的 DBContext,以跨不同架构分离不同应用程序的数据。

【问题讨论】:

  • 这完全有效,但我建议每个 database 使用一个 DbContext 来分离关注点
  • 假设模式有一些共性,为什么不呢?但如果模式完全不同,我看不出这样做的意义。
  • 重点是......我们需要在同一个数据库上模拟一个多租户系统,但使用不同的模式......
  • 明确一点,数据库是一模一样的!只是为不同的“最终用户”重复多次

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


【解决方案1】:

编辑

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

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

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>

看到我在连接字符串中放置了两个 PostgreSql 条目,一个用于 postgres 用户,一个用于 UserA

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

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

【讨论】:

  • 嗯,这不是我问的!无论如何感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2011-04-17
  • 2021-04-20
  • 1970-01-01
  • 2012-12-22
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多