2012-05-17 33 views
0

我试图找出解决这个问题的最佳方法。我在两个不同的数据库中有一个客户表(不是我所知道的理想,但它不能被修改,我必须使用我所得到的)。记录保持同步并共享几个字段(例如CustomerId,CustomerName等)。但他们也都有自己独特的领域......因此,例如:我可以在Entity Framework中合并来自多个数据库的对象吗?

数据库1客户

  • 客户编号
  • 客户名称
  • 字段1
  • 字段2

Database2客户

  • 客户编号
  • 客户名称
  • DifferentField1
  • DifferntField2

每个数据库都有自己的DbContext,我可以独立于各拉Customer对象。但我真正想要的是一个统一的Customer对象,它包含两个dbs中的所有字段的联合。

什么是最好的方式来完成这个,以便我可以公开一个统一的对象?

编辑:我使用DbSet和在我的上下文对象,指定为每个实体的映射,如下:

public DbSet<Customer> Customers { get; set; } 

,然后我的映射类具有典型的映射信息:

this.ToTable("Customer"); 
this.HasKey(t => t.CustomerId); 
this.Property(t => t.CustomerName); 

等等,所以我正在寻找一种方法来扩展这种逻辑与多个表/数据库,并能够执行不仅查询,但所有必要的CRUD操作

th anks

回答

3

所有你需要做的是声明一个类,这将代表一个统一的对象:

public class UnifiedCustomer 
{ 
    public int CustomerId {get; set;} 
    public string Name {get; set;} 
    public int Field1 {get; set;} 
    public int Field2 {get; set;} 
    public int DifferentField1 {get; set;} 
    public int DifferentField2 {get; set;} 
} 

这种类型将被用于表示来自两个数据库的数据:

var customers1 = dataContext1.Customers.Select(c => new UnifiedCustomer 
{ 
    CustomerId = c.CustomerId, 
    Name = c.CustomerName, 
    Field1 = c.Field1, 
    Field2 = c.Field2 
}); 
var cusomers2 = dataContext2.Customers.Select(c => new UnifiedCustomer 
{ 
    CustomerId = c.CustomerId, 
    Name = c.CustomerName, 
    DifferentField1 = c.DifferentField1, 
    DifferentField2 = c.DifferentField2 
}); 

具有两个集合同一类型的,你可以进行联合:

var all = customers1.Union(customers2); 
+1

我的编辑你快TYPER你... =) – EtherDragon

+0

这是可行的,但它比更复杂那看看我上面的编辑 – snappymcsnap

1

什么是最好的方法来实现这个目的,以便我可以公开一个统一的对象?

您可能需要从每个上下文中获取适当的结果,然后使用LINQ to Objects对内存中的结果集执行“联合”。

+0

这是可行的,但它的复杂多了,见上面 – snappymcsnap

0

如果两个数据库映射到同一类,你可以简单的做:

 using (var cx1 = new customerEntities(firstDbConnectionString)) 
     { 
      using (var cx2 = new customerEntities(secondDbConnectionString)) 
      { 
       return cx1.tCustomer.ToList().AddRange(cx2.tCustomer.ToList()); 
      } 
     } 
相关问题