【问题标题】:Cross database querying in EFEF 中的跨数据库查询
【发布时间】:2012-12-29 18:58:16
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

我知道这是一个老问题,但这实际上是可能的。如果数据库在同一台服务器上,那么您只需使用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 模型映射仍然可以正常工作并尊重列属性,不需要视图,也不需要存储过程。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 当然,如果您希望加入的数据库不是本地的,这根本行不通。链接服务器连接的性能也很差。我希望上下文能够尊重数据库所有权链接配置选项,因为这似乎是一个可以轻松克服的基本身份验证问题。
    【解决方案3】:

    你可以使用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 类,其中列作为具有 getter/setter 的属性,例如:

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

    【讨论】:

      【解决方案4】:

      不,你不能。您将必须创建上下文并加入自己。见here。

      您可以解决数据库诡计,在一个数据库中创建一个视图,然后在另一个数据库中反映一个表。

      【讨论】:

      • 如果数据库在同一主机上并且数据集很小,这可能是可以接受的,但一般来说,客户端连接的性能很差。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2010-12-21
      • 2021-12-05
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多