让Entity Framework不再私闯sys.databases

这里的“私闯sys.databases”是指Entity Framework默认发起的查询:SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名'

注:本文针对的是Entity Framework Code First场景,Entity Framework的版本是4.1与4.2。

3月份的时候在揭开Entity Framework LINQ查询的一点面纱一文中发现了Entity Framework的两个幕后交易。

第一个交易(私闯sys.databases):

SELECT Count(*) FROM sys.databases WHERE [nameN'CNBlogsData'

第二个交易(私自打探数据库的信息):

SELECT TOP (1)
[Extent1].[IdAS [Id],
[Extent1].[ModelHashAS [ModelHash]
FROM [dbo].[EdmMetadataAS [Extent1]
ORDER BY [Extent1].[IdDESC

当时通过modelBuilder.Conventions.Remove<IncludeMetadataConvention>();阻止了第二个交易,但未能找到方法阻止第一个交易。

记得当时用的是Entity Framework 4.0,后来微软发布了EF4.1和EF4.2。那我们来看看Entity Framework有没有改邪归正。

结果发现,只改了一半,第二个交易“浪子回头”,而第一个交易“贼心不改”。

代码世界是完美世界,决不允许这样的行为,一定要将之绳之以法。

经过今天下午的努力,终于找到了这根“绳子”:

Database.SetInitializer<DbContextTypeName>(null);

示例代码如下:

public class EfUnitOfWork : DbContext, IUnitOfWork
{
public EfUnitOfWork()
{
Database.SetInitializer<EfUnitOfWork>(null);
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}

可以看出,Entity Framework“私闯sys.databases”的目的是为了在根据实体生成数据库时,检查是否存在同名的数据库。

而我们的应用场景根本不需要Entity Framework生成数据库,所以将之绳之以法是“名正言顺”。

posted @ 2011-12-27 16:52 dudu 阅读(2101) 评论(12) 编辑 收藏

 回复 引用 查看   
#1楼 2011-12-27 16:58 LiangHu      
^_^ so that's it!
 回复 引用 查看   
#2楼 2011-12-27 17:12 CareySon      
dudu每一点性能榨取都不放过呀
 回复 引用 查看   
#3楼 2011-12-27 17:27 testzhangsan      
dudu 威武.
 回复 引用 查看   
#4楼 2011-12-27 17:34 零度的火      
终于找到解决方法了。这个问题我也头痛了好久。
不过我还感兴趣的是,楼主是怎么发现这个解决方法的? Google还是什么?

 回复 引用 查看   
#5楼 2011-12-27 17:56 Mr Yang      
不理解啊,有点深奥!
 回复 引用 查看   
#6楼 2011-12-27 21:06 中华小鹰      
在EfUnitOfWork的静态构造方法里设置Database.SetInitializer<EfUnitOfWork>(null);性能会更好
 回复 引用 查看   
#7楼 2011-12-27 21:09 中华小鹰      
第一个交易,是用来确定是否存在了指定的数据库
第二个交易,是用来确定这个数据库的表结构是否与EFCodeFirst生成的Model匹配

 回复 引用 查看   
#8楼[楼主] 2011-12-27 21:18 dudu      
@零度的火
一次次试出来,猜测可能的原因,然后测试、排除。。。

 回复 引用 查看   
#9楼 2011-12-27 21:33 SPARON      
冬天座在电脑前看博客好冷!博客园可以考虑出品一点冬天的生活用品,一方面为大家谋福利,一方面也可以为博客园带来一些盈利!
 回复 引用 查看   
#10楼 2011-12-27 22:42 熊品卿      
不知道老大有没有看到我在你文章中的回复吗?http://www.cnblogs.com/dudu/archive/2011/03/31/2001300.html#2232724
 回复 引用 查看   
#11楼[楼主] 2011-12-27 22:52 dudu      
@熊品卿
不好意思,没看到,原来“绳子”早就被你找到了。

 回复 引用 查看   
#12楼 2011-12-28 10:35 rad      
呃,话说为什么要禁用掉这2个“交易”呢?