2015-09-05 2 views
1

Я собираюсь переместить старый проект в ASP.NET MVC с EF, и есть одна проблема.Несколько DbContext для нескольких проектов. ASP.NET MVC EF

Мой проект включает в себя несколько подпроектов, и каждый проект имеет собственные таблицы, хотя структуры таблиц одинаковы.

Исх. 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"); 

     } 
    } 

Итак, есть ли хороший способ сделать это без, если-иначе-то заявление?

+0

Возможно, путем определения и реализации общего интерфейса во всех контекстах, таких как «class BaseContext: DbContext, IGenericContext» или с помощью ключевого слова «dynamic»? –

ответ

1

Что вам нужно, так это реализовать Заводской шаблон дизайна.

  • Создайте интерфейс, назовите его IDBCustomers.
  • Составьте все соответствующие классы DbContext.
  • Напишите фабричный класс, который использует переключатель/case, чтобы вернуть правильную реализацию (да, это все равно, как ваш if/then/else, но таким образом вы делаете это один раз и не разбрасываете этот код во всей своей codebase).
  • Вызовите GetDBC-клиентов на свой завод и продолжайте, как обычно.

Подробнее о модели завода и почему это хорошо для вас.

Удачи.

+0

Я сделал простую фабрику, но она не работает. Вы можете видеть ниже? – John

+0

BaseContext и BaseContext2 должны реализовать ваш интерфейс и вернуть этот список клиентов. context1/2 кажутся излишними –

0
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(); 
    } 

} 
Смежные вопросы