成人免费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數據庫性能優化

2025-03-04 00:08:55

C#MySQL數據庫

2013-10-29 09:28:38

蘇寧云商

2022-09-08 00:13:28

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

2011-04-06 16:39:01

默認數據庫

2010-07-06 09:45:08

Sybase

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技術棧公眾號

主站蜘蛛池模板: 综合久久网 | 欧美一级淫片免费视频黄 | 夜夜爽99久久国产综合精品女不卡 | 久久精品99久久 | zzzwww在线看片免费 | 亚洲www啪成人一区二区麻豆 | 情侣酒店偷拍一区二区在线播放 | 日本激情视频中文字幕 | 亚洲欧美一区二区三区情侣bbw | 日韩中文字幕一区二区 | 成人在线免费网站 | 日本一区二区三区视频在线 | 国产精品久久一区二区三区 | 欧美激情久久久久久 | 91影院在线观看 | 国产精品区一区二区三 | 色资源在线视频 | 91久久夜色| 亚洲精品一区在线观看 | 国产免费一区二区三区 | 影音先锋男 | 亚洲一区二区三区观看 | 日韩精品在线播放 | 91精品欧美久久久久久久 | 91大神在线看 | 99久久久无码国产精品 | 毛片网站在线观看 | 99久久电影 | 亚洲午夜视频 | 日韩在线看片 | 国产黄色在线观看 | 国产精品久久久久久久免费观看 | 成人在线中文字幕 | 亚洲一区二区不卡在线观看 | 日韩精品视频在线免费观看 | 色综合欧美| 成人h动漫亚洲一区二区 | 免费国产一区二区 | 在线国产一区二区三区 | 在线免费观看成年人视频 | 亚洲视频二区 |