在EF中跨数据库查询

时间:2013-01-15 16:05:35

标签: c# sql-server entity-framework cross-database

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

4 个答案:

答案 0 :(得分:23)

EF上下文不支持跨数据库查询。您需要通过SQL视图(or synonym)公开database1中的帖子,并将其用作该数据库的一部分。

答案 1 :(得分:21)

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

例如,如果我将DbCommandInterceptor附加到MyContext,,我可以拦截所有命令执行,并使用我的完整数据库路径替换查询中的指定表。

            public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> 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属性,不需要视图,也不需要存储过程。

答案 2 :(得分:11)

您可以使用ExecuteStoreQuery,例如:

var myOb = context.ExecuteStoreQuery<PlainOldClrObject>(
        @"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; }
    ...
}

答案 3 :(得分:5)

不,你不能。你必须创造上下文并加入你的自我。请参阅here

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

相关问题