是否可以在实体框架中联合来自多个数据库的对象
本文关键字:数据库 对象 实体 框架 是否 | 更新日期: 2023-09-27 18:34:40
我试图弄清楚解决这个问题的最佳方法是什么。我在两个不同的数据库中有一个客户表(我知道不理想,但它不能修改,我必须使用我得到的东西(。记录保持同步并共享多个字段(例如客户ID,客户名称等(。但他们也有自己独特的领域......所以例如:
数据库 1 客户
- 客户编号
- 客户名称
- 字段1
- 字段2
数据库 2 客户
- 客户编号
- 客户名称
- 不同领域1
- DifferntField2
每个数据库都有自己的 dbContext,我可以独立地从中提取每个 Customer 对象。但我真正想要的是一个统一的 Customer 对象,其中包括两个数据库中所有字段的联合。
实现此目的的最佳方法是什么,以便我可以公开单个统一对象?
编辑:我正在使用 DbSet 并为上下文对象中的每个实体指定映射,如下所示:
public DbSet<Customer> Customers { get; set; }
然后我的映射类具有典型的映射信息:
this.ToTable("Customer");
this.HasKey(t => t.CustomerId);
this.Property(t => t.CustomerName);
等等,所以我正在寻找一种使用多个表/数据库扩展此逻辑的方法,并且不仅能够执行查询,而且能够执行所有必要的 CRUD 操作
谢谢
您需要做的就是声明一个表示统一对象的类:
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);
实现此目的的最佳方法是什么,以便我可以公开单个统一对象?
您可能需要从每个上下文中提取适当的结果,然后使用 LINQ to Objects 对内存中的结果集执行"联合"。
如果两个数据库映射到同一个类,你可以简单地执行以下操作:
using (var cx1 = new customerEntities(firstDbConnectionString))
{
using (var cx2 = new customerEntities(secondDbConnectionString))
{
return cx1.tCustomer.ToList().AddRange(cx2.tCustomer.ToList());
}
}