Как работать со списком первых контекстов базы данных EF и правильно их приводить? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть список первых контекстов базы данных Entity Framework 6.0 с разными именами.Все они содержат таблицу с именем «Билл».Мне нужно проверить таблицу счетов каждой базы данных и добавить информацию в одну новую базу данных в зависимости от условия.Пример:

  1. Company1_Entities
  2. Company2_Entities
  3. Company3_Entities

Эти 3 базы данных содержат таблицу счетов.Мне нужно хранить эти счета условий в:

All_Bills_Entities

Поскольку число компаний будет расти, мне нужно сделать это динамичным.Я думал о чем-то вроде этого:

Dictionary<string, DbContext> lstDB = new Dictionary<string, DbContext>();

// I'm supposed to retrieve these db names from a table, but now i'm just testing

lstDB.Add("00439837", new DbContext("Company1_Entities"));
lstDB.Add("00439832", new DbContext("Company2_Entities"));
lstDB.Add("00439839", new DbContext("Company3_Entities"));

using (All_Bills_Entities main_db = new All_Bills_Entities())
{
    foreach(var dataBaseInfo in lstDB)
    {
        DbContext currentDB = dataBaseInfo.Value;

        foreach (var record in currentDB.bill.ToList()) // this does not compile, there is no bill table found here
        {
           if(record.merchant == dataBaseInfo.Key /* && other Conditions */)
           {
                main_db.bill.Add(record)
           }
        }
    }
}

1 Ответ

0 голосов
/ 22 мая 2018

Самое простое решение - заставить каждый контекст реализовать один и тот же интерфейс, например:

public interface IBillContext
{
    DbSet<Bill> bill { get; } 
}

Теперь заставьте свои контексты реализовать его:

public class Company1_Entities : IBillContext
{
    public DbSet<Bill> bill { get; set; }

    //etc...
}

И, наконец, измените свой списокчтобы использовать интерфейс:

Dictionary<string, IBillContext> lstDB = new Dictionary<string, IBillContext>();

В качестве альтернативы, если вы знаете тип, вы можете использовать свойство Set<T>.Например, если предположить, что тип сущности равен Bill:

foreach (var record in currentDB.Set<Bill>().ToList())
{
   if(record.merchant == dataBaseInfo.Key /* && other Conditions */)
   {
        main_db.bill.Add(record)
   }
}

Конечно, во время выполнения произойдет сбой, если вы добавите сущность в словарь, у которого нет этого DbSet.

...