爆料:为什么Entity Framework不能进行跨数据库查询

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03



上篇随笔中提到“对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法”。后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名,比如下面的非跨数据库查询语句:

SELECT

[
Text
]

FROM
dbo.blog_PostBody
WHERE
ID
=
3560

跨数据库查询语句:

SELECT

[
Text
]

FROM
CNBlogsText.dbo.blog_PostBody
WHERE
ID
=
3560

在Entity Framework中,我们可以通过ToTable("表名")指定表名进行映射,Entity Framework会根据指定的表名构建SQL语句,如果在这里加上数据库名和Schema名(也就是ToTable("数据库.dbo.表名")),是不是可以实现跨数据库查询呢?

于是,我们根据这个思路进行了试验,结果发现了Entity Framework不能进行跨数据库查询的秘密:Entity Framework会对ToTable()中指定的表名进行处理,加上中括号,如果没有指定Schema名,会在表名前加上[dbo],比如:ToTable("表名"),SQL语句中的表名是[dbo].[表名]。而在加“中括号”时的不正确有处理,成为了罪魁祸首。

我们试图组装一些特殊字符串骗过Entity Framework,都没成功。目前我们在用Reflector在Entity Framework的代码中寻找凶手,只有找到了凶手,知道了作案手段,才能知道是否有可能解决这个问题。

下面用代码爆一下料:

BlogDbContext的代码:

public

class
BlogDbContext : DbContext
{

public
DbSet
<
PostText
>
PostTexts {
get
;
set
; }

protected

override

void
OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity
<
PostText
>
().ToTable(
"
blog_PostBody
"
);
}
}

LINQ to Entities查询代码:

using
(BlogDbContext context
=

new
BlogDbContext())
{
(from t
in
context.PostTexts

where
t.ID
==

3560

select t.Text).FirstOrDefault();
}

1. 这是非跨数据库查询的情况,生成的SQL语句如下:

SELECT

TOP
(
1
)

[
Extent1
]
.
[
Text
]

AS

[
Text
]

FROM

[dbo].[blog_PostBody]

AS

[
Extent1
]

WHERE

3560

=

[
Extent1
]
.
[
ID
]

指定的表名是blog_PostBody,SQL语句中变成了[dbo].[blog_PostBody]。

2. 跨数据库查询:

BlogDbContext的代码改为:

modelBuilder.Entity
<
PostText
>
().ToTable(
"
CNBlogsText.dbo.blog_PostBody
"
);

生成的SQL语句:

SELECT

TOP
(
1
)

[
Extent1
]
.
[
Text
]

AS

[
Text
]

FROM

[CNBlogsText.dbo].[blog_PostBody]

AS

[
Extent1
]

WHERE

3560

=

[
Extent1
]
.
[
ID
]

CNBlogsText.dbo被整个加在了中括号中,正确的应该是[CNBlogsText].[dbo].[blog_PostBody]。

试图欺骗一下Entity Framework,将表名改为:

modelBuilder.Entity
<
PostText
>
().ToTable(
"CNBlogsText].[dbo.
blog_PostBody
"
);

生成的SQL语句:

SELECT

TOP
(
1
)

[
Extent1
]
.
[
Text
]

AS

[
Text
]

FROM

[CNBlogsText]].[dbo].[blog_PostBody]

AS

[
Extent1
]

WHERE

3560

=

[
Extent1
]
.
[
ID
]

多出了半个中括号,欺骗失败...

要想真相大白,只有找出Entity Framework中这部分处理的代码,昨天用Reflector苦苦寻觅了一个晚上未果,今天继续寻觅...

该问题已解决,见:真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)

参考页面:http://qingqingquege.cnblogs.com/p/5933752.html

时间: 2024-11-03 21:29:52

爆料:为什么Entity Framework不能进行跨数据库查询的相关文章

SQL Server 跨数据库查询

不同服务器数据库之间的数据操作 --创建链接服务器 exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时

如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参

[前言] 今天来给大家介绍下如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参! 因为我现在所测的系统模块中部分表在不同的数据库中,所以在用JDBC Request查询数据的时候遇到了这么一个跨数据库查询的问题,现在我就来说下我今天使用的办法,希望有不足之处大家多多指导下! 1.首先我们点击测试计划添加配置元件->JDBC Connection Configuration 2.然后我们新建一个线程组A,在线程组A下新建一个JDBC Request

让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.

Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include

来自博客园开发团队开发前线最新消息: 在Entity Framework中,如果实体A关联了实体B,你想在加载实体A的同时加载实体B.通常做法是在LINQ查询中使用Include().但是,如果你在查询条件中用到了实体B,EF会自动加载实体B,这时Include不仅是多余的,而且还会增加额外的LEFT OUTER JOIN查询,影响性能. 请看我们在博问开发中遭遇这个问题时的一段代码: //For q.cnblogs.com public class QuestionService { priv

在服务器中使用 Entity Framework 的 Migration 更新数据库

在开发环境中,每次我们对要对数据库进行更改,比如增加修改表字段等.改好Entity类后,我们只需在Nuget程序包管理控制台运行 update-database 脚本却可: update-database Entity Framework提供的这个Migration功能非常方便,基本上不用再打开Sql Server Management Studio了.那么如何在发布环境(服务器)中同步我们对数据库的修改呢? 一种方法是在运行 update-database 脚本加上 -verbose 或 -s

ASP.NET MVC+Entity Framework 4.1访问数据库

Entity Framework 4.1支持代码优先(code first)编程模式:即可以先创建模型类,然后通过配置在EF4.1下动态生成数据库. 下面演示两种情形: 1.代码优先模式下,asp.net mvc数据访问 2.传统模式,先创建数据库和表,配置连接字符串,再生成模型 第一种情况的步骤: (1)使用空模板,创建ASP.NET MVC3.0(或4.0)项目,假定项目名:MVC_Student 注意:创建完项目后,项目会自动引用EF4.1 (2)在Model文件夹下,创建数据库上下文类:

ABP .Net Core Entity Framework迁移使用MySql数据库

一.迁移说明 ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下. 二.迁移MySQL步骤 1. 下载项目 请到 http://aspnetboilerplate.com/Templates 下载一个新的项目,选择ASP.NET Core 2.x标签,Target Framework:选中.Net Core就可以了. 2. 移除默认SQL Server相关包 在EntityFrameworkCore项目下移除包Mi

Sqlserver分布式跨数据库查询、Join,以及分布式事务

简言: 这篇文章我要谈一谈SQL Server分布式跨服务器查询,多表Join,以及分布式事务的处理 SqlServer跨服务器查询的方式 以往自己才疏学浅,学习了一波之后,在这记录下来. 1. 使用sp_addlinkedserver和sp_addlinkedsrvlogin存储过程添加linkserver和登录 --别名 //ip地址 exec sp_addlinkedserver 'interlink','','SQLOLEDB', 'xxx.xxx.xx.xx' --别名 --登录名 -

Entity Framework 4.1 绕过 EF 查询映射

原文:http://blog.csdn.net/eqera/article/details/8411437 这是这了系列的最后一篇,我将讨论如何绕过 EF 的查询映射. 像所有优秀的框架一样,EF 知道它并不能优秀到覆盖所有的角落,通过允许直接访问数据库,EF 支持开放底层的 ADO.NET 框架. 有三个 API 支持: DbContext.Database.ExecuteSqlCommand DbContext.Database.SqlQuery DbSet.SqlQuery 第一个没有什么