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

  • 相关阅读:
    django框架的models
    图像的特征提取
    laravel框架学习
    机器学习--Classifier comparison
    java中的静态变量---static
    初次编程经历
    TERSUS笔记员工信息513-Tersus表格中勾选框升级处理
    TERSUS笔记员工信息512-Tersus勾选框全选和全不选的三种设定方法(转载+补充)
    TERSUS笔记员工信息511-Mysql查询
    TERSUS笔记员工信息510-css文字超出显示
  • 原文地址:https://www.cnblogs.com/dudu/p/entity_framework_sys_databases.html
Copyright © 2011-2022 走看看