Entity Framework 7 动态 DbContext 模型缓存 ModelCaching
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的更多相关文章
- Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext
Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext 背景 之前写过两篇文章介绍模型的合法性: DDD:关于模型的合法性,Entity.IsValid( ...
- 转载Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?
Entity Framework 4.1 DbContext使用记之一——如何查找实体? DbSet.Find函数的使用与实现 Entity Framework 4.1 DbContext使用记之二— ...
- Entity Framework 数据库先行、模型先行、代码先行
数据库先行(Database First):基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件. 模型先 ...
- Entity Framework 6.x - 创建模型来自于现有数据库
Creating a Model from an Existing Database 一.创建数据库 Chapter2 USE master GO CREATE DATABASE Chapter2 G ...
- 如何使用 Entity Framework 构造动态查询表达式
一般的程序员做上几年以后, 或多或少的都有些代码的积累, 我也不例外. 作为微软技术程序员, 自从Linq和EF出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...
- Entity Framework Linq 动态组合where条件
public static class PredicateExtensions { public static Expression<Func<T, bool>> True&l ...
- Entity Framework 之Database first(数据库优先)&Model First(模型优先)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- Entity Framework中DbContext结合TransactionScope提交事务的正确方式
问: I would like know what is the best possible way to implement transactions with DBContext. In part ...
随机推荐
- Unity3D学习笔记——NGUI之UIScrollBar
UIScrollBar:这个组件可以用于创建滚动条. 效果图如下: 一:使用步骤 1.这个组件和UISlider很像,也是由三部分组成. 2.首先创建一个Sprite用于组件的背景色. 3.创建第二个 ...
- 解决ionic 2载入速度慢的问题
1.ionic build android --prod 使用生产环境的服务器 (最关键部分) [--production-mode=y,n] ................. Tell Io ...
- python静态网页爬虫之xpath(简单的博客更新提醒功能)
直接上代码: #!/usr/bin/env python3 #antuor:Alan #-*- coding: utf-8 -*- import requests from lxml import e ...
- Laravel5.1 路由 -路由分组
路由分组有啥好处? 有时候啊 一大堆路由它们都有共同的地方,比如都使用一个中间件(过两天写)或是前缀都一样,避免代码重复 我们可以将他们分到一组中. 1 路由分组可以共享哪些属性? 中间件 middl ...
- [Spring Data MongoDB]学习笔记--MongoTemplate插入修改操作
插入操作: 直接给个例子 import static org.springframework.data.mongodb.core.query.Criteria.where; import static ...
- django restframework 的日常使用
本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...
- Python星号*与**用法分析 What does ** (double star/asterisk) and * (star/asterisk) do for parameters? 必选参数 默认参数 可变参数 关键字参数
python中*号**的区别 - CSDN博客 https://blog.csdn.net/qq_26815677/article/details/78091452 定义可变参数和定义 list 或 ...
- win8内置管理员账号既能使用metro应用又能使用默认共享
一.内置管理员账号打开METRO应用 1.按WIN+R 弹出运行框. 2.输入gpedit.msc点确定,打开本地组策略编辑器. 3.逐级选择“计算机配置”,“Windows 设置”,“安全设置”,“ ...
- php中定时计划任务的实现原理
根据php手册简单介绍一些相关的知识: 1.连接处理: 在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况: 0 - NORMAL(正常) 1 - ABORTED(异常退出) 2 - TIM ...
- shell一则-按文件每行长度排序
按文件每行长度排序 awk -F: '{print length($0) " " $0}' /etc/shadow | sort -r -n | awk '{print $2} ...