爆料:为什么Entity Framework不能进行跨数据库查询
2011-03-29 08:43
246 查看
在上篇随笔中提到“对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法”。后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名,比如下面的非跨数据库查询语句:
跨数据库查询语句:
在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的代码:
LINQ to Entities查询代码:
1. 这是非跨数据库查询的情况,生成的SQL语句如下:
指定的表名是blog_PostBody,SQL语句中变成了[dbo].[blog_PostBody]。
2. 跨数据库查询:
BlogDbContext的代码改为:
生成的SQL语句:
CNBlogsText.dbo被整个加在了中括号中,正确的应该是[CNBlogsText].[dbo].[blog_PostBody]。
试图欺骗一下Entity Framework,将表名改为:
生成的SQL语句:
多出了半个中括号,欺骗失败...
要想真相大白,只有找出Entity Framework中这部分处理的代码,昨天用Reflector苦苦寻觅了一个晚上未果,今天继续寻觅...
该问题已解决,见:真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
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不能进行跨数据库查询(附解决方法)
相关文章推荐
- 为什么Entity Framework不能进行跨数据库查询
- 真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
- 真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
- 真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
- 数据库中不能用 != NULL进行查询 如果想用的话需要把数据库属性
- 为什么不能在web页面里查询数据库?
- hadoop(为什么不能使用数据库来对大量磁盘上的大规模数据进行分析呢,为什么要用MapReduce)
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- mysql 数据库 分表后 怎么进行分页查询?Mysql分库分表方案?
- C#中,当从数据库中查询到数据,以DataTable类型返回后,如果需要对DataTable中的数据进行筛选,可以选择下面的方式
- 数据库建立索引为什么会加快查询速度
- SSH框架 不能保存 和修改,但能查询数据库记录
- 使用HQL语句的按照参数名字查询数据库信息的时候 “=:”和参数之间不能存在空格,否则会报错
- 为什么WAF(Web Aplication Firewalls)不能确保数据库安全?
- 循环查询数据库N次和用多层for循环进行N次轮循选择
- 如何使用R语言链接数据库并对数据库中的表进行查询操作
- mybatis 不能中文查询,只能进行数字或者英文查询
- hibernate 为什么可以发出insert语句,却不能完全保存到数据库呢?
- 无须进入Admin设置DSN直接连数据库进行查询
- 为什么在sql查询中需要使用xxx is null而不能使用xxx=null详解