爆料:為什麼Entity Framework不能進行跨資料庫查詢

來源:互聯網
上載者:User

在上篇隨筆中提到“對於跨資料庫查詢,我們沒有找到通過LINQ to Entities實現的方法”。後來仔細想想,從理論來講,實現跨資料庫查詢應該不難啊,與非跨資料庫查詢相比,只是多了個資料庫名,比如下面的非跨資料庫查詢語句:

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

跨資料庫查詢語句:

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

在Entity Framework中,我們可以通過ToTable("表名")指定表名進行映射,Entity Framework會根據指定的表名構建SQL語句,如果在這裡加上資料庫名和Schema名(也就是ToTable("資料庫.dbo.表名")),是不是可以實現跨資料庫查詢呢?

於是,我們根據這個思路進行了實驗,結果發現了Entity Framework不能進行跨資料庫查詢的秘密:Entity Framework會對ToTable()中指定的表名進行處理,加上中括弧,如果沒有指定Schema名,會在表名前加上[dbo],比如:ToTable("表名"),SQL語句中的表名是[dbo].[表名]。而在加“中括弧”時的不正確有處理,成為了罪魁禍首。

我們試圖組裝一些特殊字元串騙過Entity Framework,都沒成功。目前我們在用Reflector在Entity Framework的代碼中尋找兇手,只有找到了兇手,知道了作案手段,才能知道是否有可能解決這個問題。

下面用代碼爆一下料:

BlogDbContext的代碼:

public class BlogDbContext : DbContext
{
public DbSet<PostText> PostTexts { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<PostText>().ToTable("blog_PostBody");
}
}

LINQ to Entities查詢代碼:

using (BlogDbContext context = new BlogDbContext())
{
(from t in context.PostTexts
where t.ID == 3560
select t.Text).FirstOrDefault();
}

1. 這是非跨資料庫查詢的情況,產生的SQL語句如下:

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

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

2. 跨資料庫查詢:

BlogDbContext的代碼改為:

modelBuilder.Entity<PostText>().ToTable("CNBlogsText.dbo.blog_PostBody");

產生的SQL語句:

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

CNBlogsText.dbo被整個加在了中括弧中,正確的應該是[CNBlogsText].[dbo].[blog_PostBody]。

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

modelBuilder.Entity<PostText>().ToTable("CNBlogsText].[dbo.blog_PostBody");

產生的SQL語句:

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

多出了半個中括弧,欺騙失敗...

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

該問題已解決,見:真相大白:為什麼Entity Framework不能進行跨資料庫查詢(附解決方案)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.