博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF多数据库预热
阅读量:5739 次
发布时间:2019-06-18

本文共 2916 字,大约阅读时间需要 9 分钟。

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

 

主要代码如下:

 

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

 

 

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

我的项目结构如下:

 

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

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

 

转载于:https://www.cnblogs.com/yujiajun/p/EF_PreHeat.html

你可能感兴趣的文章
Struts2 学习小结
查看>>
烂泥:wordpress迁移到docker
查看>>
.扒渣机的性能及优势 
查看>>
Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题
查看>>
RSA 生成公钥、私钥对
查看>>
测试工具综合
查看>>
asp.net中调用COM组件发布IIS时常见错误 80070005解决方案
查看>>
分享一段ios数据库代码,包括对表的创建、升级、增删查改
查看>>
如何书写高质量的jQuery代码
查看>>
Activity的生命周期整理
查看>>
【记录】JS toUpperCase toLowerCase 大写字母/小写字母转换
查看>>
在 Linux 系统中安装Load Generator ,并在windows 调用
查看>>
Visifire charts ToolBar
查看>>
Mysql查询
查看>>
数据传输流程和socket简单操作
查看>>
ProbS CF matlab源代码(二分系统)(原创作品,转载注明出处,谢谢!)
查看>>
OC中KVC的注意点
查看>>
JQ入门(至回调函数)
查看>>
【洛天依】几首歌的翻唱(无伴奏)
查看>>
OpenSSL初瞻及本系列的博文的缘由
查看>>