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

时间:2018-10-30 11:06:14

标签: asp.net-mvc entity-framework model-view-controller

是否可以为同一EF模型(数据库)添加另一个数据库上下文?我遇到的情况是,数据库上下文必须更改取决于登录的用户类型。

3 个答案:

答案 0 :(得分:0)

简而言之-是的。基础的MODEL只是数据库表的类表示,因此,这里的技巧是使用Entity Framework提供的不同数据库驱动程序进行连接。

EG: 在一个类中实现一个存储库模式,并将其命名为MySqlContext,该类从DbContext继承,它将具有OnConfiguring方法:

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();

在此示例中,名为MySqlContext的存储库已经可以提供MySql或Postgres,但是没有什么可以阻止您实现另一个存储库,该存储库根据关联的数据库驱动程序提供不同的数据库上下文。

答案 1 :(得分:0)

您要使用其他DbContext类还是仅使用其他数据库? DbContext类是数据库和您的实体(EF模型)之间的桥梁。该网桥可用于与其他数据库之间的数据传输。为同一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>

尽管如此,我的建议是不要直接使用构造函数,而应使用工厂设计模式创建DbContext的适当实例。

答案 2 :(得分:0)

在Entity Framework中,DbContext类表示某种数据库布局。 DbSet<TEntity>中的DbContext代表此数据库中的表; TEntity的非虚拟属性表示表的列,TEntity的虚拟属性表示表之间的关系(一对多,多对多,...)

如果您想要具有完全相同布局的其他数据库实例,那么只需使用不同的“ NameOrConnectionString”作为构造函数中的输入参数来创建数据库的另一个实例就足够了。

如果您想要一个非常相似的数据库,并且要在其中重用另一个数据库中的某些表和关系,则应创建一个不同的DbContext类;毕竟:DbContext类代表您的数据库布局,而不同的布局意味着不同的DbContext。

在第二个DbContext中,您可能还需要与默认实体框架值不同的关系,不同的字符串长度,不同的表名(例如)。在这种情况下,最好在DbContext.OnModelCreating中使用Fluent API,而不要在实体类中使用属​​性。这样,您可以重复使用相同的实体类,同时为它们提供不同的列名,字符串长度,十进制精度等。