首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF中的跨库查询

EF中的跨库查询
EN

Stack Overflow用户
提问于 2013-01-16 00:05:35
回答 4查看 15.1K关注 0票数 21

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-16 00:09:50

EF context不支持跨数据库查询。您需要通过SQL View (or synonym)在database1中公开posts,并将其用作该数据库的一部分。

票数 25
EN

Stack Overflow用户

发布于 2014-11-14 12:29:56

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

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

代码语言:javascript
复制
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模型映射仍然正常工作,并尊重列属性,不需要视图,也不需要存储过程。

票数 27
EN

Stack Overflow用户

发布于 2013-01-16 00:15:21

您可以使用ExecuteStoreQuery,例如:

代码语言:javascript
复制
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();

您必须使用getter/setter将具有列的PlainOldClrObject类定义为属性,如下所示:

代码语言:javascript
复制
class PlainOldClrObject
{
    public int Id ( get; set; }
    public int Name ( get; set; }
    ...
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14341782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档