在EF中跨数据库查询

有没有办法在Entity Framework中实现跨数据库查询? 让我们假设我有两个实体User和Post,User实体在database1中,Post在database2中,这意味着这些实体在不同的数据库中。 我应该如何在entity framework中获得用户的post?

EF上下文不支持跨数据库查询。 您需要通过SQL View( 或同义词 )公开database1中的post,并将其用作该数据库的一部分。

我知道这是一个老线程,但实际上。 这个有可能。 如果数据库位于同一服务器上,那么您需要做的就是使用DbCommandInterceptor

例如,如果我将DbCommandInterceptor附加到MyContext,我可以拦截所有命令执行并用我的full-db路径替换查询中的指定表。

  public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext interceptionContext) { // Here, I can just replace the CommandText on the DbCommand - but remember I // want to only do it on MyContext var context = contexts.FirstOrDefault() as MyContext; if (context != null) { command.CommandText = command.CommandText .Replace("[dbo].[ReplaceMe1]", "[Database1].[dbo].[Customers]") .Replace("[dbo].[ReplaceMe2]", "[Database2].[dbo].[Addresses]") .Replace("[dbo].[ReplaceMe3]", "[Database3].[dbo].[Sales]"); } base.ReaderExecuting(command, interceptionContext); } 

关于这种方法的好处还在于EF模型映射仍能正常工作并且尊重Column属性,不需要视图,并且不需要存储过程。

您可以使用ExecuteStoreQuery ,如:

 var myOb = context.ExecuteStoreQuery( @"select * from db1.dbo.table1 t1 join db2.dbo.table2 t2 on t2.t1_id = t1.id where t1.id = {0}", table1Id).FirstOrDefault(); 

您必须定义一个PlainOldClrObject类,其列为具有getters / setter的属性,如:

 class PlainOldClrObject { public int Id ( get; set; } public int Name ( get; set; } ... } 

不,你不能。 你必须创造上下文并加入你的自我。 看到这里 。

您可以解析数据库欺骗,在一个数据库中创建一个视图,反映另一个数据库中的表。