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

上篇随笔中提到“对于跨数据库查询,我们没有找到通过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不能进行跨数据库查询(附解决方法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值