2017-04-07 16 views
1

我们对当前项目使用EF.Core。该项目有三个数据库,这是一个真正的麻烦,不能真正避免。数据库具有相同的结构。因此,我们可以交换上下文并使用相同的EF模型来执行CRUD操作。仅使用一个dbContext在多个数据库上执行投影

我们有一个特别复杂的查询,我们将从传统的ADO.NET原始SQL移植而来。问题是它是一个跨数据库查询。为了复制这个问题,我们真正需要的是从同一个dbContext中的三个数据库获得所有查询的三个表。

绝对噩梦去,尝试了很多东西。 Table Per Hierarchy(TPH)是EF Core中继承的东西吗?我不相信它可以完成多个数据库。这是我们使用的一个有用的网站。 http://learnentityframeworkcore.com/inheritance

所以我们想知道是否有人有任何体面的信息可以使用EF来实现。

回答

1

好吧,所以我相信我们已经找到了一种方法来使用EF Core进行交叉数据库查询,并在数据库上执行而不是在共享内存中执行。因此,我将以股票系统为例进行说明。我希望它对某人有用。

首先需要为主表上的SQLSERVER数据库创建所有同义词,因此关联表全部链接在一起。

然后我们的EF模型和派生类应该如下。

public abstract class Stock 
{ 
    public int ID{get;set;} 
    public string stockName{get;set;} 
} 

[Table("dbname.scheme.Stock", Schema = "dbo")] 
public class WinterStock : Stock 
{ 
    public WinterStock() : base() { } 
} 

[Table("dbname.scheme.Stock", Schema = "dbo")] 
public class SummerStock : Stock 
{ 
    public SummerStock() : base() { } 
} 

在我们的测试方法,我们有......

var query = _context.Set<WinterStock>().Join(_context.Set<SummerStock>(), winterStock => winterStock.stockName,summerStock => summerStock.stockName, (summerStock,winterStock) => new { summerStock, winterStock }); 
    var result = query.ToList(); 
0

有趣的问题。

一个上下文不能跨越多个数据库,

使用多个上下文将在存储器结束载入数据,做LINQ到这或许是不期望的或甚至可能的对象。

第一个选项是使用数据库中的链接表和针对它的查询。我认为这是最简单的。

我不知道有多么复杂的查询,有多大的数据表明一个在内存中的情况下,根据你正在做在您的查询你可能有一些临时的解决方案,例:

  • 您可以实现一些枚举器,这些枚举器可以通过内存中有效的进程所需的特定顺序从一个数据库加载数据,然后您可以将它们合并为一个并使用它。
  • 如果您的查询是关于加入大数据的更多信息,您必须将其分解,创建具有最少数量的列项目的对象并基于该项目实施查询,此外,您还可以使用此查询结果进行其他查询加载缺失的列。
+0

感谢您的信息。我们基本上试图避免在内存中加载。试图让数据库来做到这一点。 –

相关问题