真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
在上篇随笔中,我们发现Entity Framework在构建SQL语句时,将ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlogsTex.dbo.blog_PostBody"转换为"[CNBlogsText.dbo].[blog_PostBody]",从而造成不能进行跨数据库查询。
今天上午,我们通过Reflector对Entity Framework的代码进行分析,找出了真相。
真相如下:
1. 对于“CNBlogsTex.dbo.blog_PostBody"字符串,Entity Framework对其进行了拆分,拆分为:Schema名称(CNBlogsTex.dbo)与数据库表名称(blog_PostBod)。
这部分是在System.Data.Entity.ModelConfiguration.Utilities.ObjectExtensions的ParseQualifiedTableName()方法中处理的,Reflector出来的代码如下:
public static void ParseQualifiedTableName(string qualifiedName, out string schemaName, out string tableName)
{
qualifiedName = qualifiedName.Trim();
int length = qualifiedName.LastIndexOf('.');
schemaName = null;
tableName = qualifiedName;
switch (length)
{
case -1:
break; case 0:
throw Error.ToTable_InvalidSchemaName(qualifiedName); default:
if (length == (tableName.Length - 1))
{
throw Error.ToTable_InvalidTableName(qualifiedName);
}
schemaName = qualifiedName.Substring(0, length);
tableName = qualifiedName.Substring(length + 1);
break;
}
if (string.IsNullOrWhiteSpace(schemaName))
{
schemaName = null;
}
}
2. 方括号的添加(CNBlogsTex.dbo变为[CNBlogsTex.dbo],blog_PostBod变为[blog_PostBod])是在System.Data.SqlClient.SqlDdlBuilder的AppendIdentifier(string identifier)方法中处理的,Reflector出来的代码如下:
private void AppendIdentifier(string identifier)
{
this.AppendSql("[" + identifier.Replace("]", "]]") + "]");
}
所以,当我们当表名改为"CNBlogsText].[dbo.blog_PostBody"时,"CNBlogsText].[dbo"就被转换为"[CNBlogsText]].[dbo]"。
不仅有代码有真相,而且有图有真相:

知道了真相,目前只能望真相心叹,能不能解决这个问题还是未知数...
更新:
killkill的一句回复让“心叹”变成了“兴奋”,那种程序员特有的,一般人享受不到的兴奋...
原来要欺骗的不是Entity Framework,而且是SQL Server,用SQL Server的同义词(SYNONYM)可以轻松搞定这个问题,创建同义词的SQL语句如下:
CREATE SYNONYM [dbo].[CNBlogsText__blog_PostBody] FOR [CNBlogsText].[dbo].[blog_PostBody]
非常感谢killkill的帮助!
真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)的更多相关文章
- Entity Framework - Func引起的数据库全表查询
原文:http://www.cnblogs.com/dudu/archive/2012/04/01/enitity_framework_func.html 使用 Entity Framework 最要 ...
- 不同SQL Server数据库之间的跨数据库查询
--不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...
- ORACLE跨数据库查询的方法
原文地址:http://blog.csdn.net/huzhenwei/article/details/2533869 本文简述了通过创建database link实现Oracle跨数据库查询的方法 ...
- 如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参
[前言] 今天来给大家介绍下如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参! 因为我现在所测的系统模块中部分表在不同的数据库中,所以在用JDBC ...
- SQL SERVER SP命令及实现跨数据库查询
1.数据库: (1)sp_helpdb:报告有关指定数据库或所有数据库的信息. 例:sp_helpdb --显示所有数据库信息(名称.大小等) 例:sp_helpdb Recruitment ...
- Sqlserver2012数据库乱码的解决方法
Sqlserver2012数据库乱码的解决方法 1. 在创建数据库时,一定要指定数据库的排序规则 2. 输入数据库名称 3. 选中选项,在排序规则中选中Chinese_P ...
- Asp.Net 应用程序在IIS发布后无法连接oracle数据库问题的解决方法
asp.net程序编写完成后,发布到IIS,经常出现的一个问题是连接不上Oracle数据库,具体表现为Oracle的本地NET服务配置成功:用 pl/sql 等工具也可以连接上数据库,但是通过浏览器中 ...
- 让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库
获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/do ...
- Entity Framework 连接低版本数据库
使用EF6连接SQL2012生成的Edmx,分页时生成的查询语句使用了SQL 2012引入的新特性 OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY,结果在生产环境使用的数 ...
随机推荐
- 关于oracle的sequence和trigger。
原先mysql中每个自增字段,在oracle中就需要建立一个sequence和一个trigger. 就算同一个表中有x个自增字段,那么就需要建立x个sequence和x和trigger. 实际中,我建 ...
- linux7开机自启动东方通tongweb
自启动服务: 可以通过把TongWeb设置为系统服务来实现. 具体实现: 以root用户进行操作,在/etc/init.d目录下编写TongWeb的服务脚本tongweb,用来控制TongWeb的启动 ...
- 手动拼写出来的sp_who结果集
SELECT SPID = er.session_id ,STATUS = ses.STATUS ,[Login] = ses.login_name ,Host = ses.host_name ...
- Redis、MongoDB及Memcached的区别 Redis(内存数据库)
Redis.MongoDB及Memcached的区别 Redis(内存数据库) 是一个key-value存储系统(布式内缓存,高性能的key-value数据库).和Memcached类似,它支持存储的 ...
- django--博客--forms组件-用户注册
---------------------------------------------前端页面简易代码----------------------------------------------- ...
- iMessenger 2.0.14.0801简述
有些梦,看似遥不可及.但并非不能实现,仅仅要你足够的强!!.人力有时而穷,所以我们可能还须要一些热心人的帮助.这个人可能就是你. 四年来,我们一直在努力,从未放弃. 在我们做好一件事之前.我们永远不知 ...
- Java并发—原子类,java.util.concurrent.atomic包(转载)
原子类 Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量 ...
- Redis六(管道)
管道 为什么使用管道? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处 ...
- Myeclipse中文乱码解决方式
我们刚刚安装的Myeclipse有可能使用的是GBK的编码方式,而通常我们的程序都是使用的是UTF-8的编码方式,所以当我们导入一个项目的时候,会产生乱码,解决方式如下: 一.将整个project设置 ...
- C语言-随机数
C语言使用rand()函数产生随机数, 使用rand()函数之前要先使用srand(time(0)), 以当前时间作为种子, 否则产生的随机数将不会变化. #include <stdio.h&g ...