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

Posted

技术标签:

【中文标题】具有实体框架的动态多数据库上下文【英文标题】:Dynamic multi-database Context with Entity framework 【发布时间】:2017-05-14 07:41:51 【问题描述】:

我正在开发一个可以与多个数据库管理器交互的 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】:

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

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

【讨论】:

以上是关于具有实体框架的动态多数据库上下文的主要内容,如果未能解决你的问题,请参考以下文章

具有存储库模式的实体框架,将数据插入到具有多对多关系的表中

从具有多对多关系核心数据iOS的上下文中删除nsmanagedboject

使用实体框架在 ASP.NET MVC 中为具有一对多关系的数据库播种

实体框架在多对多关系中重复条目

使用带有实体框架的动态字段按子记录排序

多对多(自相关)特定订单实体框架