爆料:为什么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]
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]
试图欺骗一下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苦苦寻觅了一个晚上未果,今天继续寻觅...
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
2005-03-29 [新功能]个人Blog页面左侧显示最新随笔列表
2004-03-29 [转载]Mono: .NET Runtime hosts Java!