几个项目的几个 DbContext。 ASP.NET MVC EF
Several DbContext for several projects. ASP.NET MVC EF
我打算将一个旧项目移动到带有 EF 的 ASP.NET MVC,但有一个问题。
我的项目包括几个子项目,每个项目都有自己的 table,尽管 table 结构相同。
例如。 XXX_Customers、YYY_Customers 等等
我找到了一种解决方案来实现我想要的。 (使用 if-else-then 语句)。
控制器动作:
public ActionResult Index(string projectname)
{
List<Customers> list = new List<Customers>() ;
if (projectname=="XXX")
{
list = new BaseContext().Customers.ToList();
}
else if (projectname=="YYY")
{
list = new BaseContext2().Customers.ToList();
}
return View(list);
}
型号:
public class Customers
{
public int Id { get; set; }
public string Name { get; set; }
public string UniqueValue { get; set; }
}
public class BaseContext : DbContext
{
public BaseContext()
: base("myconnectionstring")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Customers> Customers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customers>().Property(p => p.Id).HasColumnName("ID");
modelBuilder.Entity<Customers>().Property(p => p.Name).HasColumnName("Name");
modelBuilder.Entity<Customers>().Property(p => p.UniqueValue).HasColumnName("UniqueValue");
modelBuilder.Entity<Customers>().ToTable("XXX_Table1", "MyScheme");
}
}
public class BaseContext2 : DbContext
{
public BaseContext2()
: base("myconnectionstring")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Customers> Customers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customers>().Property(p => p.Id).HasColumnName("ID");
modelBuilder.Entity<Customers>().Property(p => p.Name).HasColumnName("Name");
modelBuilder.Entity<Customers>().Property(p => p.UniqueValue).HasColumnName("UniqueValue");
modelBuilder.Entity<Customers>().ToTable("YYY_Table1", "MyScheme");
}
}
那么,有没有不用if-else-then语句的好方法呢?
您需要的是实施工厂设计模式。
- 创建一个接口,例如调用它
IDBCustomers
。
- 让所有相关的
DbContext
class 实施它。
- 写一个使用 switch/case 的工厂 class 到 return 正确的实现(是的,这仍然像你的 if/then/else - 但这样你只做一次,不要在你的整个代码库中散布这种代码).
- 调用工厂的 GetDBCustomers 并照常进行。
在网上阅读有关工厂设计模式的更多信息以及它为何适合您。
祝你好运。
public interface IDbCustomer
{
DbContext GetDbCustomer();
}
public class FactoryDbCustomer
{
static public IDbCustomer GetDbContext(string projectName)
{
IDbCustomer obCustomer = null;
switch (projectName)
{
case "XXX":
obCustomer = new context1();
break;
case "YYY":
obCustomer = new context2();
break;
default:
break;
}
return obCustomer;
}
}
public class context1 : IDbCustomer
{
public DbContext GetDbCustomer()
{
return new BaseContext();
}
}
public class context2 : IDbCustomer
{
public DbContext GetDbCustomer()
{
return new BaseContext2();
}
}
我打算将一个旧项目移动到带有 EF 的 ASP.NET MVC,但有一个问题。
我的项目包括几个子项目,每个项目都有自己的 table,尽管 table 结构相同。
例如。 XXX_Customers、YYY_Customers 等等
我找到了一种解决方案来实现我想要的。 (使用 if-else-then 语句)。
控制器动作:
public ActionResult Index(string projectname)
{
List<Customers> list = new List<Customers>() ;
if (projectname=="XXX")
{
list = new BaseContext().Customers.ToList();
}
else if (projectname=="YYY")
{
list = new BaseContext2().Customers.ToList();
}
return View(list);
}
型号:
public class Customers
{
public int Id { get; set; }
public string Name { get; set; }
public string UniqueValue { get; set; }
}
public class BaseContext : DbContext
{
public BaseContext()
: base("myconnectionstring")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Customers> Customers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customers>().Property(p => p.Id).HasColumnName("ID");
modelBuilder.Entity<Customers>().Property(p => p.Name).HasColumnName("Name");
modelBuilder.Entity<Customers>().Property(p => p.UniqueValue).HasColumnName("UniqueValue");
modelBuilder.Entity<Customers>().ToTable("XXX_Table1", "MyScheme");
}
}
public class BaseContext2 : DbContext
{
public BaseContext2()
: base("myconnectionstring")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Customers> Customers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customers>().Property(p => p.Id).HasColumnName("ID");
modelBuilder.Entity<Customers>().Property(p => p.Name).HasColumnName("Name");
modelBuilder.Entity<Customers>().Property(p => p.UniqueValue).HasColumnName("UniqueValue");
modelBuilder.Entity<Customers>().ToTable("YYY_Table1", "MyScheme");
}
}
那么,有没有不用if-else-then语句的好方法呢?
您需要的是实施工厂设计模式。
- 创建一个接口,例如调用它
IDBCustomers
。 - 让所有相关的
DbContext
class 实施它。 - 写一个使用 switch/case 的工厂 class 到 return 正确的实现(是的,这仍然像你的 if/then/else - 但这样你只做一次,不要在你的整个代码库中散布这种代码).
- 调用工厂的 GetDBCustomers 并照常进行。
在网上阅读有关工厂设计模式的更多信息以及它为何适合您。
祝你好运。
public interface IDbCustomer
{
DbContext GetDbCustomer();
}
public class FactoryDbCustomer
{
static public IDbCustomer GetDbContext(string projectName)
{
IDbCustomer obCustomer = null;
switch (projectName)
{
case "XXX":
obCustomer = new context1();
break;
case "YYY":
obCustomer = new context2();
break;
default:
break;
}
return obCustomer;
}
}
public class context1 : IDbCustomer
{
public DbContext GetDbCustomer()
{
return new BaseContext();
}
}
public class context2 : IDbCustomer
{
public DbContext GetDbCustomer()
{
return new BaseContext2();
}
}