日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
爆料:為什么EntityFramework不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢

在上篇隨筆中提到“對(duì)于跨數(shù)據(jù)庫(kù)查詢,我們沒有找到通過LINQ to Entities實(shí)現(xiàn)的方法”。后來(lái)仔細(xì)想想,從理論來(lái)講,實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)查詢應(yīng)該不難啊,與非跨數(shù)據(jù)庫(kù)查詢相比,只是多了個(gè)數(shù)據(jù)庫(kù)名,比如下面的非跨數(shù)據(jù)庫(kù)查詢語(yǔ)句:

站在用戶的角度思考問題,與客戶深入溝通,找到炎陵網(wǎng)站設(shè)計(jì)與炎陵網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋炎陵地區(qū)。

 
 
 
  1. SELECT  [Text]  FROM dbo.blog_PostBody WHERE ID=3560 

跨數(shù)據(jù)庫(kù)查詢語(yǔ)句:

 
 
 
  1. SELECT  [Text]  FROM CNBlogsText.dbo.blog_PostBody WHERE ID=3560 

在Entity Framework中,我們可以通過ToTable("表名")指定表名進(jìn)行映射,Entity Framework會(huì)根據(jù)指定的表名構(gòu)建SQL語(yǔ)句,如果在這里加上數(shù)據(jù)庫(kù)名和Schema名(也就是ToTable("數(shù)據(jù)庫(kù).dbo.表名")),是不是可以實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)查詢呢?

于是,我們根據(jù)這個(gè)思路進(jìn)行了試驗(yàn),結(jié)果發(fā)現(xiàn)了Entity Framework不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢的秘密:Entity Framework會(huì)對(duì)ToTable()中指定的表名進(jìn)行處理,加上中括號(hào),如果沒有指定Schema名,會(huì)在表名前加上[dbo],比如:ToTable("表名"),SQL語(yǔ)句中的表名是[dbo].[表名]。而在加“中括號(hào)”時(shí)的不正確有處理,成為了罪魁禍?zhǔn)住?/p>

我們?cè)噲D組裝一些特殊字符串騙過Entity Framework,都沒成功。目前我們?cè)谟肦eflector在Entity Framework的代碼中尋找兇手,只有找到了兇手,知道了作案手段,才能知道是否有可能解決這個(gè)問題。

下面用代碼爆一下料:

BlogDbContext的代碼:

 
 
 
  1. public class BlogDbContext : DbContext  
  2. {  
  3.     public DbSet PostTexts { get; set; }  
  4.     protected override void OnModelCreating(DbModelBuilder modelBuilder)  
  5.     {  
  6.         modelBuilder.Entity().ToTable("blog_PostBody");  
  7.     }  

LINQ to Entities查詢代碼:

 
 
 
  1. using (BlogDbContext context = new BlogDbContext())  
  2. {  
  3.     (from t in context.PostTexts  
  4.         where t.ID == 3560  
  5.         select t.Text).FirstOrDefault();  

1. 這是非跨數(shù)據(jù)庫(kù)查詢的情況,生成的SQL語(yǔ)句如下:

 
 
 
  1. SELECT TOP (1)   
  2. [Extent1].[Text] AS [Text]  
  3. FROM [dbo].[blog_PostBody] AS [Extent1]  
  4. WHERE 3560 = [Extent1].[ID] 

指定的表名是blog_PostBody,SQL語(yǔ)句中變成了[dbo].[blog_PostBody]。

2. 跨數(shù)據(jù)庫(kù)查詢:

BlogDbContext的代碼改為:

 
 
 
  1. modelBuilder.Entity().ToTable("CNBlogsText.dbo.blog_PostBody"); 

生成的SQL語(yǔ)句:

 
 
 
  1. SELECT TOP (1)  
  2. [Extent1].[Text] AS [Text]  
  3. FROM [CNBlogsText.dbo].[blog_PostBody] AS [Extent1]  
  4. WHERE 3560 = [Extent1].[ID] 

CNBlogsText.dbo被整個(gè)加在了中括號(hào)中,正確的應(yīng)該是[CNBlogsText].[dbo].[blog_PostBody]。

試圖欺騙一下Entity Framework,將表名改為:

 
 
 
  1. modelBuilder.Entity().ToTable("CNBlogsText].[dbo.blog_PostBody"); 

生成的SQL語(yǔ)句:

 
 
 
  1. SELECT TOP (1)   
  2. [Extent1].[Text] AS [Text]  
  3. FROM [CNBlogsText]].[dbo].[blog_PostBody] AS [Extent1]  
  4. WHERE 3560 = [Extent1].[ID] 

多出了半個(gè)中括號(hào),欺騙失敗...

要想真相大白,只有找出Entity Framework中這部分處理的代碼,昨天用Reflector苦苦尋覓了一個(gè)晚上未果,今天繼續(xù)尋覓...


網(wǎng)頁(yè)名稱:爆料:為什么EntityFramework不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢
文章位置:http://m.5511xx.com/article/djpcesd.html