真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
2012-10-01 03:07
435 查看
在上篇随笔中, 我们发现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出来的代码如下:
2. 方括号的添加(CNBlogsTex.dbo变为[CNBlogsTex.dbo],blog_PostBod变为[blog_PostBod])是在 System.Data.SqlClient.SqlDdlBuilder的AppendIdentifier(string identifier)方法中处理的,Reflector出来的代码如下:
不仅有代码有真相,而且有图有真相:
知道了真相,目前只能望真相心叹,能不能解决这个问题还是未知数...
更新:
killkill的一句回复让“心叹”变成了“兴奋”,那种程序员特有的,一般人享受不到的兴奋...
原来要欺骗的不是Entity Framework,而且是SQL Server,用SQL Server的同义词(SYNONYM)可以轻松搞定这个问题,创建同义词的SQL语句如下:
今天上午,我们通过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不能进行跨数据库查询(附解决方法)
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- SQL Server 数据库移植后不能执行大数据量查询 解决方法
- 为什么Entity Framework不能进行跨数据库查询
- laravel查询得到的数据(为对象object)无法进行数组循环遍历,而且不能用数组方式访问和查看的原因以及解决方法
- Hibernate的save方法不能进行数据库插入的解决办法
- 爆料:为什么Entity Framework不能进行跨数据库查询
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
- 数据库查询出时间,传给前端变为一串数字,有以下两种解决方法
- 不能执行查询,因为一些文件丢失或未注册 解决方法
- 不能对存储过程进行单步调试的问题解决方法
- 解决Microsoft SQL Server Management Studio Express不能在win7附加数据库的方法
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
- 数据库进行外键关联失败的解决方法
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
- mysqli使用预处理技术进行数据库查询的方法
- 30多条mysql语句级优化方法,千万级数据库记录查询轻松解决
- php5.3不能连接mssql数据库的解决方法