c# - 带有 Entity Framework 的动态多数据库上下文

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

我正在开发一个可以与多个数据库管理器交互的 ASP.NET 应用程序。所以我决定使用 Entity Framework 来成功地与这些数据库管理器交互。目前我的问题是,当我想从一个数据库切换到另一个数据库时,我不得不修改“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 文件,以便您可以根据用户的选择动态切换。

预先感谢您的回答

最佳答案

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

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 平台上都使用迁移?仍然有两个独立的上下文似乎很烦人,但由于它们是不同的平台,您最终将需要单独的迁移来支持它们之间的差异。

关于c# - 带有 Entity Framework 的动态多数据库上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388883/

相关文章:

javascript - 开始将后台代码转换为客户端

php - 如何使按钮在同一页面上执行但不在下一页上执行

php - 如何使用 InsertInto 将清理后的用户输入存储在数据库中

javascript - 拒绝加载脚本,因为它违反了以下内容安全策略指令 : "style-src ' self' 'unsafe-inline'

c# - BeginProcessRequest() 中到底发生了什么? (无 session 状态)

c# - 如果我有一个 TextBox 是 Checkbox 的子项,是否可以输入破折号?

c# - 声明之间的事件处理差异?

c# - 如何声明这个嵌套数组/列表?

mysql - 如何从终端导出mysql表

asp.net - 从任何请求输入绑定(bind) : FromQuery, FromRoute, FromForm