|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。在上篇漫笔中,我们发明EntityFramework在构建SQL语句时,将ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlogsTex.dbo.blog_PostBody"转换为"[CNBlogsText.dbo].[blog_PostBody]",从而形成不克不及举行跨数据库查询。
明天上午,我们经由过程Reflector对EntityFramework的代码举行剖析,找出了原形。
原形以下:
1.关于“CNBlogsTex.dbo.blog_PostBody"字符串,EntityFramework对其举行了拆分,拆分为:Schema称号(CNBlogsTex.dbo)与数据库表称号(blog_PostBod)。
这部分是在System.Data.Entity.ModelConfiguration.Utilities.ObjectExtensions的ParseQualifiedTableName()办法中处置的,Reflector出来的代码以下:- publicstaticvoidParseQualifiedTableName(stringqualifiedName,outstringschemaName,outstringtableName){qualifiedName=qualifiedName.Trim();intlength=qualifiedName.LastIndexOf(.);schemaName=null;tableName=qualifiedName;switch(length){case-1:break;case0:throwError.ToTable_InvalidSchemaName(qualifiedName);default:if(length==(tableName.Length-1)){throwError.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(stringidentifier)办法中处置的,Reflector出来的代码以下:- privatevoidAppendIdentifier(stringidentifier){this.AppendSql("["+identifier.Replace("]","]]")+"]");}
复制代码 以是,当我们当表名改成"CNBlogsText].[dbo.blog_PostBody"时,"CNBlogsText].[dbo"就被转换为"[CNBlogsText]].[dbo]"。
不但有代码有原形,并且有图有原形:
晓得了原形,今朝只能看原形心叹,能不克不及办理这个成绩仍是未知数...
更新:
killkill的一句复兴让“心叹”酿成了“镇静”,那种程序员独有的,常人享用不到的镇静...
本来要棍骗的不是EntityFramework,并且是SQLServer,用SQLServer的同义词(SYNONYM)能够轻松弄定这个成绩,创立同义词的SQL语句以下:- CREATESYNONYM[dbo].[CNBlogsText__blog_PostBody]FOR[CNBlogsText].[dbo].[blog_PostBody]
复制代码 十分感激killkill的匡助!我也不知道,我原来理解的,NET就是C++编程,只是与net网页编程相对,呵呵。以为.ET就是高级C++编程。 |
|