SAL

  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

【转】让Entity Framework不再私闯sys.databases

Posted on 2013-10-14 23:30  SAL  阅读(300)  评论(0编辑  收藏  举报

这里的“私闯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生成数据库,所以将之绳之以法是“名正言顺”。