真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
我们发现Entity Framework在构建SQL语句时,将ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlogsTex.dbo.blog_PostBody"转换为"[CNBlogsText.dbo].[blog_PostBody]",从而造成不能进行跨数据库查询。
今天上午,我们通过Reflector对Entity Framework的代码进行分析,找出了真相。
真相如下: www.2cto.com
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]
作者:dudu
最近更新
随机推荐
- 2019中国(成都)网络视听创新展开幕
- 传腾讯将通过DST投资小米 总金额超20
- 掌众金融玩转智能+服务
- 微软上周的安全更新破坏了用户的字体
- 衣旧有温暖环保致青春 闲鱼飞蚂蚁联合
- 加拿大人称十七分钟就破译了二战信鸽
- 美国国务院频遭世界范围的黑客攻击
- 我用电脑黑了全世界(十五)
- Fedora SSSD中的BE数据库空口令绕过认
- 英国剑桥官方旅游网站被黑客攻击
- 重庆帮考教育保荐代表人培训在线答疑
- OpenSSL CMS结构处理内存破坏漏洞
- 美国主机IXWebHosting被推荐为最佳十
- 调查显示企业基础设施安全问题中最重
- Adobe Photoshop CS4 11.0.0 TIFF文件
- 180迈养车网,开启后市场汽车电商新玩
- 我用电脑黑了全世界(十三)
- 日本版微信Line拟7月在东京纽约上市
- 浏览器UC式独立:阿里增资意在制衡百
- 黑帽大会:DNS漏洞可导致多种服务被攻