如何处理EF数据库第一个上下文列表并正确转换它们?

时间:2018-05-22 15:21:25

标签: c# entity-framework dynamic

我列出了具有不同名称的实体框架6.0数据库第一个上下文。它们都包含一个名为" bill"的表。我需要检查每个数据库的账单表,并根据条件将信息添加到单个新数据库中。示例:

  1. Company1_Entities
  2. Company2_Entities
  3. Company3_Entities
  4. 这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 :(得分:2)

最简单的解决方案是使每个上下文实现相同的接口,例如:

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的字典中,这会在运行时失败。