• 【转】让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生成数据库,所以将之绳之以法是“名正言顺”。

  • 相关阅读:
    IT开发者对Mac钟爱
    POJ 3486 &amp; HDU 1913 Computers(dp)
    基础排序算法
    LeetCode 70:Climbing Stairs
    Qt自己定义事件实现及子线程向主线程传送事件消息
    maven自己主动编译,解决你每次代码改动须要又一次编译的繁琐
    Unity定制 Image、Text的对象生成
    iOS学习4_UITableView的使用
    GTK+重拾--09 GTK+中的组件(一)
    Architecting Android…The clean way?
  • 原文地址:https://www.cnblogs.com/SALIN/p/3369407.html
Copyright © 2020-2023  润新知