具有实体框架的动态多数据库上下文
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