成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數據庫
在上篇隨筆中,我們發現Entity Framework在構建SQL語句時,將ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlogsTex.dbo.blog_PostBody"轉換為"[CNBlogsText.dbo].[blog_PostBody]",從而造成不能進行跨數據庫查詢。

上篇隨筆中,我們發現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出來的代碼如下:

  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. 方括號的添加(CNBlogsTex.dbo變為[CNBlogsTex.dbo],blog_PostBod變為[blog_PostBod])是在System.Data.SqlClient.SqlDdlBuilder的AppendIdentifier(string identifier)方法中處理的,Reflector出來的代碼如下:

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

所以,當我們當表名改為"CNBlogsText].[dbo.blog_PostBody"時,"CNBlogsText].[dbo"就被轉換為"[CNBlogsText]].[dbo]"。

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

 

知道了真相,目前只能望真相心嘆,能不能解決這個問題還是未知數...

更新:

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

原來要欺騙的不是Entity Framework,而且是SQL Server,用SQL Server的同義詞(SYNONYM)可以輕松搞定這個問題,創建同義詞的SQL語句如下:

  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. 博客園現代化建設——Entity Framework
  2. 博客園現代化建設——AutoMapper
  3. 爆料:為什么Entity Framework不能進行跨數據庫查詢

 

責任編輯:艾婧 來源: 博客園
相關推薦

2011-03-30 14:08:01

Entity Fram跨數據庫查詢

2020-05-06 22:43:09

筆記本塑料機身鋁鎂合金

2018-08-08 09:37:00

數據騰訊運維

2010-10-26 09:08:48

云計算

2011-07-14 15:24:26

MSSQL數據庫跨數據庫查詢

2009-12-30 09:10:04

ADO.NET Ent

2009-05-04 13:43:16

SQL Server置疑數據庫恢復

2010-10-20 17:21:07

連接SQL Serve

2021-10-13 09:46:11

數據庫工具技術

2011-08-30 09:54:00

2011-05-11 13:19:42

MySQL數據庫性能優化

2013-10-29 09:28:38

蘇寧云商

2025-03-04 00:08:55

C#MySQL數據庫

2022-09-08 00:13:28

云計算云數據庫數字化轉型

2010-07-06 09:45:08

Sybase

2011-04-06 16:39:01

默認數據庫

2009-03-23 09:05:01

2019-11-21 09:00:00

數據驗證EF Core

2010-06-21 09:54:50

Linux Aplay

2010-10-14 13:45:44

MySQL函數不能創建
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲第一av网站 | 亚洲一区二区三区四区五区午夜 | 成人视屏在线观看 | 日韩有码一区 | 欧美日韩国产一区二区三区 | 91一区| 中文字幕乱码一区二区三区 | 四虎永久| 国产精品久久久久久吹潮 | 色综合天天综合网国产成人网 | 在线播放中文字幕 | 神马福利| 日本精品久久 | 国产中文区二幕区2012 | 美女黄色在线观看 | www.av7788.com| 性色综合| 中文字幕在线一区二区三区 | 亚洲在线视频 | 日本三级电影在线观看视频 | 中文av在线播放 | 欧美日韩亚洲一区 | 精品国产一二三区 | 拍戏被cao翻了h承欢 | 国产精品区二区三区日本 | 成人在线一区二区 | 亚洲日韩中文字幕一区 | 亚洲狠狠爱| 日韩毛片 | 国产午夜在线 | 神马久久av| 国产网站久久 | 日本xx视频免费观看 | 久久中文视频 | 成人在线一区二区 | 偷派自拍 | 国产超碰人人爽人人做人人爱 | 亚洲欧美日韩精品久久亚洲区 | 午夜影院在线视频 | 日本免费网| 免费观看一级特黄欧美大片 |