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