是否可以在实体框架中联合来自多个数据库的对象

本文关键字:数据库 对象 实体 框架 是否 | 更新日期: 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());
            }
        }