zoukankan      html  css  js  c++  java
  • 让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生成数据库,所以将之绳之以法是“名正言顺”。

  • 相关阅读:
    常见排序算法的实现和比较
    关于数据库索引的原理和应用
    数据库查询优化的几种方式
    进程间通信的几种方式
    TCP的三次握手和四次分手
    【面试题35】第一个只出现一次的字符
    【面试题34】丑数
    【面试题33】把数组排成最小的数
    【面试题32】从1到n整数中1出现的次数
    简单工厂模式
  • 原文地址:https://www.cnblogs.com/dudu/p/entity_framework_sys_databases.html
Copyright © 2011-2022 走看看