[英]How to handle one class used in multiple db contexts for one database in EF code first?
[英]How to deal with a list of EF database first contexts and cast them correctly?
我有一个使用不同名称的实体框架的6.0数据库优先上下文列表。 它们都包含一个名为“ bill”的表。 我需要检入每个数据库的账单表,并根据情况将信息添加到单个新数据库中。 范例:
Company1_Entities
Company2_Entities
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)
}
}
}
}
最简单的解决方案是使每个上下文实现相同的接口,例如:
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的实体添加到字典中,则这将在运行时失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.