博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
阅读量:6333 次
发布时间:2019-06-22

本文共 1877 字,大约阅读时间需要 6 分钟。

在中,我们发现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]"。

不仅有代码有真相,而且有图有真相:

2011032913554543.jpg

知道了真相,目前只能望真相心叹,能不能解决这个问题还是未知数...

更新:

的一句回复让“心叹”变成了“兴奋”,那种程序员特有的,一般人享受不到的兴奋...

原来要欺骗的不是Entity Framework,而且是SQL Server,用SQL Server的同义词(SYNONYM)可以轻松搞定这个问题,创建同义词的SQL语句如下:

 
CREATE
SYNONYM
[
dbo
]
.
[
CNBlogsText__blog_PostBody
]
FOR
[
CNBlogsText
]
.
[
dbo
]
.
[
blog_PostBody
]
非常感谢 的帮助!

转载于:https://www.cnblogs.com/dudu/archive/2011/03/29/entity_framework_cross_database_query_fact.html

你可能感兴趣的文章
新闻数据库分表案例
查看>>
Phalcon VS Spring 用法对照表(一)
查看>>
特殊字符的表示方法
查看>>
双网卡网络访问问题解决( 路由 route )
查看>>
基于oracle的sql优化
查看>>
Win10内置管理员无法激活此应用解决办法?
查看>>
TrueType
查看>>
Swift 利用元组来匹配多个值
查看>>
确认对话框ConfirmDialog和选择对话框OptionDialog:猜数游戏
查看>>
HTML排版标记
查看>>
再见!2015
查看>>
MongoDB 自动分片 auto sharding
查看>>
巧用Android多进程,微信,微博等主流App都在用
查看>>
C++链式结构的自定义容器类(二)--迭代器
查看>>
EPON OLT网管系统的实现
查看>>
CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
查看>>
sql server express 2005下载地址
查看>>
kindeditor4.x整合SyntaxHighlighter代码高亮
查看>>
Hibernate-Validate结合SpringMVC数据验证
查看>>
Firefox下给HTTPS Everywhere增加自定义规则
查看>>