自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

真相大白:為什么Entity Framework不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢(附解決方法)

數(shù)據(jù)庫(kù)
在上篇隨筆中,我們發(fā)現(xiàn)Entity Framework在構(gòu)建SQL語(yǔ)句時(shí),將ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlogsTex.dbo.blog_PostBody"轉(zhuǎn)換為"[CNBlogsText.dbo].[blog_PostBody]",從而造成不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢。

上篇隨筆中,我們發(fā)現(xiàn)Entity Framework在構(gòu)建SQL語(yǔ)句時(shí),將ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlogsTex.dbo.blog_PostBody"轉(zhuǎn)換為"[CNBlogsText.dbo].[blog_PostBody]",從而造成不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢。

今天上午,我們通過(guò)Reflector對(duì)Entity Framework的代碼進(jìn)行分析,找出了真相。

真相如下:

1. 對(duì)于“CNBlogsTex.dbo.blog_PostBody"字符串,Entity Framework對(duì)其進(jìn)行了拆分,拆分為:Schema名稱(CNBlogsTex.dbo)與數(shù)據(jù)庫(kù)表名稱(blog_PostBod)。

這部分是在System.Data.Entity.ModelConfiguration.Utilities.ObjectExtensions的ParseQualifiedTableName()方法中處理的,Reflector出來(lái)的代碼如下:

  1. public static void ParseQualifiedTableName(string qualifiedName, out string schemaName, out string tableName)  
  2. {  
  3.     qualifiedNamequalifiedName = qualifiedName.Trim();  
  4.     int length = qualifiedName.LastIndexOf('.');  
  5.     schemaName = null;  
  6.     tableName = qualifiedName;  
  7.     switch (length)  
  8.     {  
  9.         case -1:  
  10.             break;  
  11.         case 0:  
  12.             throw Error.ToTable_InvalidSchemaName(qualifiedName);  
  13.         default:  
  14.             if (length == (tableName.Length - 1))  
  15.             {  
  16.                 throw Error.ToTable_InvalidTableName(qualifiedName);  
  17.             }  
  18.             schemaName = qualifiedName.Substring(0, length);  
  19.             tableName = qualifiedName.Substring(length + 1);  
  20.             break;  
  21.     }  
  22.     if (string.IsNullOrWhiteSpace(schemaName))  
  23.     {  
  24.         schemaName = null;  
  25.     }  

2. 方括號(hào)的添加(CNBlogsTex.dbo變?yōu)閇CNBlogsTex.dbo],blog_PostBod變?yōu)閇blog_PostBod])是在System.Data.SqlClient.SqlDdlBuilder的AppendIdentifier(string identifier)方法中處理的,Reflector出來(lái)的代碼如下:

  1. private void AppendIdentifier(string identifier)  
  2. {  
  3.     this.AppendSql("[" + identifier.Replace("]", "]]") + "]");  

所以,當(dāng)我們當(dāng)表名改為"CNBlogsText].[dbo.blog_PostBody"時(shí),"CNBlogsText].[dbo"就被轉(zhuǎn)換為"[CNBlogsText]].[dbo]"。

不僅有代碼有真相,而且有圖有真相:

 

知道了真相,目前只能望真相心嘆,能不能解決這個(gè)問(wèn)題還是未知數(shù)...

更新:

killkill的一句回復(fù)讓“心嘆”變成了“興奮”,那種程序員特有的,一般人享受不到的興奮...

原來(lái)要欺騙的不是Entity Framework,而且是SQL Server,用SQL Server的同義詞(SYNONYM)可以輕松搞定這個(gè)問(wèn)題,創(chuàng)建同義詞的SQL語(yǔ)句如下:

  1. CREATE SYNONYM [dbo].[CNBlogsText__blog_PostBody] FOR [CNBlogsText].[dbo].[blog_PostBody] 

非常感謝killkill的幫助!

原文鏈接:http://www.cnblogs.com/dudu/archive/2011/03/29/entity_framework_cross_database_query_fact.html

【編輯推薦】

  1. 博客園現(xiàn)代化建設(shè)——Entity Framework
  2. 博客園現(xiàn)代化建設(shè)——AutoMapper
  3. 爆料:為什么Entity Framework不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢

 

責(zé)任編輯:艾婧 來(lái)源: 博客園
相關(guān)推薦

2011-03-30 14:08:01

Entity Fram跨數(shù)據(jù)庫(kù)查詢

2010-10-26 09:08:48

云計(jì)算

2020-05-06 22:43:09

筆記本塑料機(jī)身鋁鎂合金

2018-08-08 09:37:00

數(shù)據(jù)騰訊運(yùn)維

2011-07-14 15:24:26

MSSQL數(shù)據(jù)庫(kù)跨數(shù)據(jù)庫(kù)查詢

2009-12-30 09:10:04

ADO.NET Ent

2009-05-04 13:43:16

SQL Server置疑數(shù)據(jù)庫(kù)恢復(fù)

2010-10-20 17:21:07

連接SQL Serve

2021-10-13 09:46:11

數(shù)據(jù)庫(kù)工具技術(shù)

2011-08-30 09:54:00

2025-03-04 00:08:55

C#MySQL數(shù)據(jù)庫(kù)

2011-05-11 13:19:42

MySQL數(shù)據(jù)庫(kù)性能優(yōu)化

2011-04-06 16:39:01

默認(rèn)數(shù)據(jù)庫(kù)

2022-09-08 00:13:28

云計(jì)算云數(shù)據(jù)庫(kù)數(shù)字化轉(zhuǎn)型

2010-07-06 09:45:08

Sybase

2019-11-21 09:00:00

數(shù)據(jù)驗(yàn)證EF Core

2009-03-23 09:05:01

2010-10-14 13:45:44

MySQL函數(shù)不能創(chuàng)建

2010-06-21 09:54:50

Linux Aplay

2013-10-29 09:28:38

蘇寧云商
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)