爆料:为什么Entity Framework不能进行跨数据库查询

数据库
在上篇随笔中提到“对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法”。后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名。

上篇随笔中提到“对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法”。后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名,比如下面的非跨数据库查询语句:

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

跨数据库查询语句:

  1. 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的代码:

  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. 这是非跨数据库查询的情况,生成的SQL语句如下:

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

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

2. 跨数据库查询:

BlogDbContext的代码改为:

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

生成的SQL语句:

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

CNBlogsText.dbo被整个加在了中括号中,正确的应该是[CNBlogsText].[dbo].[blog_PostBody]。

试图欺骗一下Entity Framework,将表名改为:

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

生成的SQL语句:

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

多出了半个中括号,欺骗失败...

要想真相大白,只有找出Entity Framework中这部分处理的代码,昨天用Reflector苦苦寻觅了一个晚上未果,今天继续寻觅...

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

【编辑推荐】

  1. 博客园现代化建设——Entity Framework
  2. 博客园现代化建设——AutoMapper

 

责任编辑:艾婧 来源: 博客园
相关推荐

2011-03-30 14:26:03

Entity Fram跨数据库查询

2009-12-30 09:10:04

ADO.NET Ent

2011-07-14 15:24:26

MSSQL数据库跨数据库查询

2011-08-30 09:54:00

2011-05-11 13:19:42

MySQL数据库性能优化

2022-09-08 00:13:28

云计算云数据库数字化转型

2019-11-21 09:00:00

数据验证EF Core

2020-03-27 16:05:49

数据库数据MySQL

2022-04-14 08:21:35

数据库查询变慢MySQL

2020-07-13 08:18:58

跨库查询MySQL数据库

2020-02-19 15:01:30

数据库SQL技术

2012-07-20 10:38:25

Entity FramEF

2011-08-09 16:08:53

数据库连接

2011-03-01 16:30:55

Oracle

2010-03-30 18:48:24

Oracle 学习

2024-01-08 08:15:57

数据库优化内存

2021-10-22 05:52:27

数据库调整大小容量

2020-08-10 09:07:00

数据库IT技术

2020-11-10 08:38:43

数据库HugePages内存

2022-11-14 08:12:34

点赞
收藏

51CTO技术栈公众号