代码之家  ›  专栏  ›  技术社区  ›  lazerbrain

同一EF模型(数据库)的不同数据库上下文?

  •  0
  • lazerbrain  · 技术社区  · 7 年前

    3 回复  |  直到 7 年前
        1
  •  0
  •   Willem Steyn    7 年前

    简言之,是的。底层模型只是数据库表的类表示,因此这里的技巧是使用Entity Framework提供的不同数据库驱动程序建立连接。

    如:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            using (var secretsClient = new InsightSecrets())
            {
                var connectionInfo = // here you add your own depending on environment and project
                string connectionString = connectionInfo.ConnectionString;
    
                optionsBuilder.UseMySql(connectionString);
            }
        }
    

    optionsBuilder实例可以在上面的示例中创建MySql或Postgress引用,而该存储库将在类构造函数中执行类似操作,从而在代码的更高层实例化,其中将使用以下上下文:

    var ctx = new MySqlContext();
    

        2
  •  0
  •   Kostas Dafnomilis    7 年前

    你想要不同的吗 DbContext 类还是只是一个不同的数据库?这个 DbContext 类是数据库和实体(EF模型)之间的桥梁。此网桥可用于将数据从不同的数据库传输到不同的数据库。创造一个不同的世界 DbContext

    DbContext

    public class TestContext : DbContext
    {
        public DbSet<Foo> Foos { get; set; }
        public DbSet<AnotherFoo> AFoos { get; set; }
    
        public TestContext() : this("TestDB1") { }
    
        public TestContext(string databaseName)
            : base(databaseName)
        {
            Configuration.LazyLoadingEnabled = true;
        }
    }
    

    这个 DbContext 构建与数据库的连接,该数据库在基本构造函数中提供数据库名称。因此,您可以通过构造函数控制它所连接的数据库。

    数据库的连接字符串必须在 .config

    <connectionStrings>
      <add name="TestDBContext1" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=TestDB1; persist security info=True; user id=sa; password=saexpress;" providerName="System.Data.SqlClient" />
      <add name="TestDBContext2" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=TestDB2; persist security info=True; user id=sa; password=saexpress;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    要创建 .

        3
  •  0
  •   Harald Coppoolse    7 年前

    DbContext 类表示特定的数据库布局。这个 DbSet<TEntity> 在 DbContext 表示该数据库中的表;网络的非虚拟属性 TEntity 表示表的列和表的虚拟属性 张力

    如果您想要一个非常相似的数据库,其中您想要重用来自另一个数据库的一些表和关系,那么您应该创建一个不同的数据库 DbContext DbContext 类表示数据库布局,不同的布局表示不同的DbContext。

    可能是在这一秒 DbContext 您还需要与默认实体框架值不同的关系、不同的字符串长度、不同的表名等。在这种情况下,最好在应用程序中使用fluentapi DbContext.OnModelCreating ,而不是实体类中的属性。通过这种方式,您可以重复使用相同的实体类,同时为它们指定不同的列名、字符串长度、小数精度等。

    推荐文章