具有实体框架的动态多数据库上下文

时间:2016-12-30 00:02:00

标签: c# mysql asp.net sql-server entity-framework

我正在开发一个可以与多个数据库管理器交互的ASP.NET应用程序。所以我决定使用实体框架成功地与这些数据库管理器交互。目前我的问题是,当我想从一个数据库切换到另一个数据库时,我被迫修改“DbContext”的构造函数。 例如,在SqlServer下使用数据库就是我的ApplicationContext类的样子

 public class ApplicationContext : DbContext
{
    public DAOContext() : base("name=SqlServerContext")
    {
    }

    public DbSet<Client> Clients { get; set; }
    public DbSet<Commande> Commandes { get; set; }
    public DbSet<Produit> Produits { get; set; }
    public DbSet<LigneCmd> LignesCmd { get; set; }
}

要访问MySql数据库,这是我的ApplicationContext的样子

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class DAOContext : DbContext
{
    public DAOContext() : base("name=MySqlDAOContext")
    {
    }

    public DbSet<Client> Clients { get; set; }
    public DbSet<Commande> Commandes { get; set; }
    public DbSet<Produit> Produits { get; set; }
    public DbSet<LigneCmd> LignesCmd { get; set; }
}

要使用我的ApplicationContext类,我使用数据访问层。这是一个例子

public class ProduitsDAL
{
    public ApplicationContext db { get; set; }

    public ProduitsDAO()
    {
        DbInit();
    }

    public void DbInit()
    {
        db = new ApplicationContext();
    }

    public List<Produit> ListProduits()
    {
        List<Produit> Produits = new List<Produit>();
        Produits = db.Produits.OrderBy(p => p.ProduitId).ToList();

        return Produits;
    }
}

ProduitsDAL ProduitsManager = new ProduitsDAL();
List<Produit> ListProduits = new List<Produit>();
ListProduits = ProduitsManager.ListProduits();

我想要为每个数据库管理器创建一个ApplicationContext文件,以便您可以根据用户的选择动态切换。

提前感谢您的回答

1 个答案:

答案 0 :(得分:3)

您可以为两个上下文设置基类:

public abstract class ApplicationContext : DbContext
{
    public ApplicationContext(string cxnStringName) : base("name="+cxnStringName)
    {
    }

    public DbSet<Client> Clients { get; set; }
    public DbSet<Commande> Commandes { get; set; }
    public DbSet<Produit> Produits { get; set; }
    public DbSet<LigneCmd> LignesCmd { get; set; }
}

然后为每个特定平台派生一个上下文:

class SqlServerContext : ApplicationContext
{
    public SqlServerContext() : base("SqlServerContext")
    {
    }
}

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
class MySqlContext : ApplicationContext
{
    public MySqlContext() : base("MySqlDAOContext")
    {
    }
}

然后在DbInit函数中,您可以在上下文类型之间切换。 如果您的模型已更新,则两个上下文都会获得更新,并且任何常见的上下文代码(如流畅的模型构建)都会在ApplicationContext基类中进行。 注意:我已将基类标记为抽象,以强制用户使用其中一种派生类型。

现在你在两个sql server平台上使用迁移吗?仍然有两个单独的上下文可能看起来很烦人但是因为它们是不同的平台,所以最终需要单独的迁移来支持它们之间的差异。