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

爆料:為什么Entity Framework不能進(jìn)行跨數(shù)據(jù)庫(kù)查詢

數(shù)據(jù)庫(kù)
在上篇隨筆中提到“對(duì)于跨數(shù)據(jù)庫(kù)查詢,我們沒(méi)有找到通過(guò)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ù)名。

上篇隨筆中提到“對(duì)于跨數(shù)據(jù)庫(kù)查詢,我們沒(méi)有找到通過(guò)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ǔ)句:

  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中,我們可以通過(guò)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),如果沒(méi)有指定Schema名,會(huì)在表名前加上[dbo],比如:ToTable("表名"),SQL語(yǔ)句中的表名是[dbo].[表名]。而在加“中括號(hào)”時(shí)的不正確有處理,成為了罪魁禍?zhǔn)住?/p>

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

下面用代碼爆一下料:

BlogDbContext的代碼:

  1. public class BlogDbContext : DbContext  
  2. {  
  3.     public DbSet<PostText> PostTexts { get; set; }  
  4.     protected override void OnModelCreating(DbModelBuilder modelBuilder)  
  5.     {  
  6.         modelBuilder.Entity<PostText>().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<PostText>().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<PostText>().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ù)尋覓...

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

【編輯推薦】

  1. 博客園現(xiàn)代化建設(shè)——Entity Framework
  2. 博客園現(xiàn)代化建設(shè)——AutoMapper

 

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

2011-03-30 14:26:03

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

2009-12-30 09:10:04

ADO.NET Ent

2011-07-14 15:24:26

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

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)化

2022-09-08 00:13:28

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

2019-11-21 09:00:00

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

2020-03-27 16:05:49

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

2022-04-14 08:21:35

數(shù)據(jù)庫(kù)查詢變慢MySQL

2012-07-20 10:38:25

Entity FramEF

2020-07-13 08:18:58

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

2020-02-19 15:01:30

數(shù)據(jù)庫(kù)SQL技術(shù)

2011-08-09 16:08:53

數(shù)據(jù)庫(kù)連接

2024-06-18 12:58:12

2020-08-10 09:07:00

數(shù)據(jù)庫(kù)IT技術(shù)

2020-11-10 08:38:43

數(shù)據(jù)庫(kù)HugePages內(nèi)存

2024-01-08 08:15:57

數(shù)據(jù)庫(kù)優(yōu)化內(nèi)存

2021-10-22 05:52:27

數(shù)據(jù)庫(kù)調(diào)整大小容量

2025-04-03 11:04:40

點(diǎn)贊
收藏

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