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

  • 相关阅读:
    java面试笔记6
    Java面试笔记5
    Java面试笔记5
    网上订单管理-新增
    网上订单管理-级联;可编辑列表
    网上订单管理-新增、修改
    数据库嵌套查询
    网上订单管理-数据呈现
    video 移动端内联播放,视频上层可显示弹幕、点赞。video转canvas播放
    vue 日期格式化过滤器
  • 原文地址:https://www.cnblogs.com/dudu/p/entity_framework_sys_databases.html
Copyright © 2020-2023  润新知