代码之家  ›  专栏  ›  技术社区  ›  Antoine Pelletier

如何处理EF database first上下文列表并正确转换它们?

  •  0
  • Antoine Pelletier  · 技术社区  · 8 年前

    我有一个entity framework的6.0 database first上下文列表,这些上下文具有不同的名称。它们都包含一个名为“bill”的表。我需要签入每个数据库的账单表,并根据条件将信息添加到单个新数据库中。例子:

    1. Company1_Entities
    2. Company2_Entities
    3. Company3_Entities

    这3个数据库包含bill表。我需要将这些账单条件存储到:

    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 回复  |  直到 8 年前
        1
  •  2
  •   DavidG    8 年前

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

    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)
       }
    }
    

    当然,如果您向字典中添加了一个没有此数据库集的实体,那么在运行时这将失败。