易做图大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
我们发现Entity Framework在构建SQL语句时,将ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlogsTex.dbo.blog_PostBody"转换为"[CNBlogsText.dbo].[blog_PostBody]",从而造成不能进行跨数据库查询。
今天上午,我们通过Reflector对Entity Framework的代码进行分析,找出了易做图。
易做图如下: www.zzzyk.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的一句回复让“心叹”变成了“兴奋”,那种程序员特有的,一般人享受不到的兴奋...