EF多数据库预热

使用EF第一次加载程序会很慢,因为EF第一次会生成实体类和数据库的对应关系并做缓存,怎么解决这个问题呢?站在巨人的肩膀上将会省力很多,博客园的dudu已经给出了个解决方案(EF版本6.0以上)

http://www.cnblogs.com/dudu/p/entity-framework-warm-up.html

主要代码如下:

using (var dbcontext = new CnblogsDbContext())
{
    var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
    var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
    mappingCollection.GenerateViews(new List<EdmSchemaError>());
}

根据代码来看一个表对应一个操作类,而我的项目使用的是Code First并使用了仓储模式(EF的三种模式区别自行查找资料),所以要做修改。

我的项目结构如下:

public class Repository<T> : DbContext, IRepository<T>
        where T : class,new()
    {
        private static readonly string connection = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
        private DbSet<T> _dbSet;
        public Repository()
            : base(connection)
        { }
        public DbSet<T> Query
        {
            get
            {
                if (_dbSet == null)
                    _dbSet = Set<T>();
                return _dbSet;
            }
        }
}

使用的是泛型,所以我的解决方法是使用反射

解决方法:

private static void LoadEFViewMapping()
        {
            string[] items = { "Fish.Model" };
            foreach (var item in items)
            {
                var data = Assembly.Load(item.Trim());
                data.GetBaseClass()
                    .Where(g => g.BaseType == typeof(MySqlBase))
                    .ToList()
                    .ForEach(entity =>
                    {
                        Type type = typeof(MySqlRepository<>);
                        type = type.MakeGenericType(entity);
                        var objectContext = ((IObjectContextAdapter)Activator.CreateInstance(type)).ObjectContext;
                        var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
                        mappingCollection.GenerateViews(new List<EdmSchemaError>());
                    });
                data.GetBaseClass()
                    .Where(g => g.BaseType == typeof(SqlServerBase))
                    .ToList()
                    .ForEach(entity =>
                    {
                        Type type = typeof(SqlServerRepository<>);
                        type = type.MakeGenericType(entity);
                        var objectContext = ((IObjectContextAdapter)Activator.CreateInstance(type)).ObjectContext;
                        var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
                        mappingCollection.GenerateViews(new List<EdmSchemaError>());
                    });
            }
        }

解释一下:因我所有的实体类需执行一个去除EF访问多余数据方法(具体参考:http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html),所以所有实体都继承一个基类,而本项目同时使用MySql和SqlServer数据库所以有了MySqlBase和SqlServerBase类,这两个类都继承自基类BaseEntity,实体类根据访问数据库分别继承MySqlBase和SqlServerBase类

时间: 2024-10-01 20:50:20

EF多数据库预热的相关文章

EF 创建数据库的策略 codefist加快效率!【not oringin!】

今天去搜寻,ef创建数据库的策略有四种,区分还是和数据库里sql的创建的语句这些英文差不多一致. 一:数据库不存在时重新创建数据库 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>()); 策略二:每次启动应用程序时创建数据库 Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<

EF codefirst 数据库迁移

如果出现 未能加载文件或程序集“Microsoft.VisualStudio.Shell, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项.系统找不到指定的文件. 重新安装EF 命令Install-Package EntityFramework 在此之后 主要是3步走: 1:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbC

EF操作数据库的步骤和一些简单操作语句

这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面的内容,直接点击这个链接,因为写的真的不错:https://www.cnblogs.com/gosky/p/5751815.html. 我个人还没有对EF相关的内容进行详细的整理,所以这篇随笔的参考意义不大,只是贴一些代码上去,以后有机会有时间,会对相关内容做一个总结. 使用EF操作数据库的详细步骤

asp.net core系列 30 EF管理数据库架构--必备知识 迁移

原文:asp.net core系列 30 EF管理数据库架构--必备知识 迁移 一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为准,请使用迁移. 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与 EF Core 模型兼容.  (2)如果希望以数据库架构为准,请使用反向工程. 使用此方法,可通过将数

EF Core 数据库迁移(Migration)

工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql) 场景 设计两张表 用户表(user)和发帖表(user) 一个用户对应多个用户 Coding Begin 1.新建项目(新建一个空console项目) 2.添加Nuget.config 增加

关于EF更新数据库,更新指定字段的设置

1.关于EF跟新数据库更新指定字段的设置 在EF提交到数据库的时候或许某些字段不想更新.或者自己更新一个模型到数据库去! 1.更新数据不更新一些字段 /// <summary> /// 数据库指定更新字段 /// </summary> [HttpGet] public HttpResponseMessage alterUserInfo(int id) { //先查询 后修改 var user = DbContent.k_user.Where(o => o.id == id).

EF查询数据库框架的搭建

一个简单的EF查询框架除了运行项目外,大概需要5个类库项目,当然这个不是一定要这样做,这可以根据自己的需要设置有多少个项目.这里介绍的方法步骤只适合EF零基础的人看看就是了. 在开始之前,先建立一个运行项目,不管是MVC还是winfrom项目,只要能运行就OK,这是为了在后面能测试EF框架的地方. 一.模型项目.这个项目主要负责与数据库映射的,里面的类都是数据库表的实体. 首先在解决方案中建一个文件夹EFModel,这里将会收纳所有的与EF查询有关的项目,这样做只是为了将他们与运行项目分开而已,

EF CodeFirst 数据库创建与迁移

一.EF CodeFirst 根据实体创建数据库 1.新建好实体类 2.添加数据库上下文的类StudentInfoEntities:继承DbContext 3.配置Web.Config连接数据库字符串(name=“数据库上下文类的名称”) 4.写个controller运行代码,自动生成数据库 二.迁移数据库(sqlserver) 当修改实体属性后需要迁移数据库:打开工具-->NuGet程序包管理器-->程序包管理器控制台 1.第一次迁移先执行命令:Enable-Migrations 2.Add

Asp.net MVC4 使用EF实现数据库的增删改查

EF的使用 步骤: (1)将EF添加到项目:在Model右击添加新建项 找到ADO.NET实体数据模型,接着... (2)实现数据库的增删改查 查询 (因为在Model中已经添加EF实体了,所以就可以在Controller中进行有关的数据库操作) <<controller>> //数据上下文对象 OrderDBEntities db = new OrderDBEntities(); public ActionResult Index() { //使用SQO(标准查询运算符),查询