EF7里实例化DbContext变的有点麻烦了, 下面这个基类会有所帮助:

    public abstract class BaseDbContext : DbContext
{
private string _connectionString; public BaseDbContext(string connectionString) : base()
{
_connectionString = connectionString;
} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer(_connectionString).UseRowNumberForPaging();
}
}

通过重载 OnModelCreating 方法, 可以动态的添加实体类型到DbContext。 该方法在DbContext进行第一次查询时执行,以后会进行全局缓存。

这样显得EF很笨重,不过通过一些处理,可以让它灵活起来。

一种方法是利用泛型类:

    public class DbContext<TEntity1, TEntity2> : BaseDbContext
where TEntity1: class
where TEntity2: class
{
public DbSet<TEntity1> Entity1Set { get; set; }
public DbSet<TEntity2> Entity2Set { get; set; } public DbContext(string connectionString) : base(connectionString)
{
}
}

还可以在 OnModelCreating 方法中, 利用一些规则动态添加实体类型。  但是因为模型信息全局缓存的原因,这种动态处理的DbContext,在第一次使用后很难再添加其它实体类型了。

下面这个类可以有效的解决这个问题:

//cnblog aC#Coder 原创方法,转载请留此信息。
public class NewDbContext:BaseDbContext
{
public NewDbContext(string connectionString) : base(connectionString) { } private List<Type> _EntityTypes = new List<Type>(); private static ModelBuilder _modelBuilder; public DbSet<TEntity> AddSet<TEntity>() where TEntity : class
{
_EntityTypes.Add(typeof(TEntity)); if(_modelBuilder != null)
this.OnModelCreating(_modelBuilder);
return this.Set<TEntity>();
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var type in _EntityTypes)
{
modelBuilder.Entity(type);
}
base.OnModelCreating(modelBuilder);
_modelBuilder = modelBuilder;
} }

这样灵活性和缓存的高效性都有了。

Entity Framework 7 动态 DbContext 模型缓存 ModelCaching的更多相关文章

  1. Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext

    Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext 背景 之前写过两篇文章介绍模型的合法性: DDD:关于模型的合法性,Entity.IsValid( ...

  2. 转载Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

    Entity Framework 4.1 DbContext使用记之一——如何查找实体? DbSet.Find函数的使用与实现 Entity Framework 4.1 DbContext使用记之二— ...

  3. Entity Framework 数据库先行、模型先行、代码先行

    数据库先行(Database First):基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件. 模型先 ...

  4. Entity Framework 6.x - 创建模型来自于现有数据库

    Creating a Model from an Existing Database 一.创建数据库 Chapter2 USE master GO CREATE DATABASE Chapter2 G ...

  5. 如何使用 Entity Framework 构造动态查询表达式

    一般的程序员做上几年以后, 或多或少的都有些代码的积累, 我也不例外. 作为微软技术程序员, 自从Linq和EF出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...

  6. Entity Framework Linq 动态组合where条件

    public static class PredicateExtensions { public static Expression<Func<T, bool>> True&l ...

  7. Entity Framework 之Database first(数据库优先)&Model First(模型优先)

    一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...

  8. C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)

    一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...

  9. Entity Framework中DbContext结合TransactionScope提交事务的正确方式

    问: I would like know what is the best possible way to implement transactions with DBContext. In part ...

随机推荐

  1. mongodb性能问题及原理分析

    近期忙着把一个项目从MySQL迁移到MongoDB,在导入旧数据的过程中.遇到了些许波折,犯了不少错误,但同一时候也学到了不少知识,遂记录下来. 公司为这个项目专门配备了几台高性能务器,清一色的双路四 ...

  2. Entity Framework中的主从表关系的使用

    其关系图: 我们使用Entity Framework生成映射关系如下: 其中author表中的books导航属性为一个集合,表示当前作者的书. 在页面中我们可以使用如下代码来实现: 代码中author ...

  3. javascript拼接html代码

    转自开源中国社区:http://www.oschina.net/code/snippet_94055_21640经常做jsp开发的朋友可能遇到一个情况,显示列表数据不是table,而是div或者其他很 ...

  4. Week 3: Assessing performance 笔记

    得到一个模型之后如何评价其性能? training error & generalization error & test error 如何理解generalization error ...

  5. <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性

    <block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性

  6. API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd API 网关出现的原因

    API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd http://www.infoq.com/cn/articles/compa ...

  7. JavaScript函数setInterval()和setTimeout()正确的写法

    一.常规写法 1.1 不传参数 function a (x, y) { var i = 0; var b = function(){ console.log((x * y) + (i++)); } r ...

  8. JavaScript通过preventDefault()使input[type=text]禁止输入但保留光标

    一.说明 取消事件的默认动作. 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit",在事件传播的任意阶段 ...

  9. Vue中获取dom元素

    Vue.js虽然说是数据驱动页面的,但是有时候我们也要获取dom对象进行一些操作. vue的不同版本获取dom对象的方法不一样 Vue.js  1.0版本中,通过v-el绑定,然后通过this.els ...

  10. Linux下安装MongoDB全程记录

    1.下载安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.0.tgz 2.解压缩 [root@loca ...