zoukankan      html  css  js  c++  java
  • 让Entity Framework不再私闯sys.databases 不自动创建数据库(转载)

    原文:http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html

    这里的“私闯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 [name] = N'CNBlogsData'

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

    SELECT TOP (1)
    [Extent1].[Id] AS [Id],
    [Extent1].[ModelHash] AS [ModelHash]
    FROM [dbo].[EdmMetadata] AS [Extent1]
    ORDER BY [Extent1].[Id] DESC

    当时通过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生成数据库,所以将之绳之以法是“名正言顺”。

  • 相关阅读:
    osu合集(期望dp)
    P1640 [SCOI2010]连续攻击游戏
    P2155 [SDOI2008]沙拉公主的困惑
    P3419 [POI2005]SAMToy Cars / SP688 SAM Toy Cars
    P3586 [POI2015]LOG
    P4147 玉蟾宫
    P4454 [CQOI2018]破解DH协议
    射击小游戏一02(玩家和怪物添加)
    ASCII,Unicode和UTF8
    Android中MenuInflater实例
  • 原文地址:https://www.cnblogs.com/zjmsky/p/4822979.html
Copyright © 2011-2022 走看看