Entity Framework中使用DbCompiledModel中遇到的坑和解决方案

前段时间,在公司做项目时,引入Entity Framework Code First的方法。

我们公司的软件为SaaS结构,有N个企业注册,其中SQL Server中有一张表为t_User_企业注册号,比如第1000个来注册的企业,为它生成t_User_1000这张数据表。

这种方式下,如何生成User对象跟数据表的对应关系呢?直接在OnModelCreating里面直接ToTable来绑定?

如果稍懂点Entity Framework的实现细节,这种方式实现有一个很大的问题,就是OnModelCreating只会调用一次。

如果你在代码中两次new出这个Model1,如下:

在这种情况下,第二次new Model1(10001)时,在该模型中对应的表却是t_User_1000。因为第二次new Model1后,在操作时,不会调用OnModelCreating!OnModelCreating只会调用一次,并且会进行相关对应的缓存。

那么这种方法下,我们如何让第二次创建模型也调用OnModelCreating呢?办法是:没有任何办法! 我们只能在Model的构造函数里下功夫,我们需要将我在创建好的模型传到的Model1的构造函数中,代码如下:

为了方便,我写一个静态方法来生成类

这样是不是完美解决了企业号与企业相关数据表的对应关系?看似解决了,但实际上隐藏了一个大坑。

如果我们用如下的代码去调用。

结果是怎么呢?内存爆涨,直到out of memory ! 每次CreateModel的时候,Entity Framework都进行了相关对应以及数据的缓存,即使是相同的对应关系(比如1000和10001),在Entity Framwork框架里也要分别缓存10000遍。

在这种情况下,有什么解决方法呢?唯一的解决方法就是将DbCompiledModel自已缓存起来。如下代码所示:

用这种方案,当我们调用10000次的创建过程,Entity Framework只分别为1000号企业和10001号企业创建一次缓存。

但是这个方案也还是有一个隐藏的问题,目前我们注册企业数为几百个,这样在dict中缓存几百个企业的DbCompiledModel是没有问题的,但是当我们的注册企业数目达到上万时,由于要在dict中缓存上万个企业的DbCompiledModel,内存照样要爆掉。目前我们正在分析Entity Framework的源码,以寻找更好的解决方案。

原文地址:https://www.cnblogs.com/threefires/p/9261229.html

时间: 2024-10-08 07:21:46

Entity Framework中使用DbCompiledModel中遇到的坑和解决方案的相关文章

利用Entity Framework修改指定字段中的值

利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码: [HttpPost] public ActionResult Edit(Article model) { if (model.Id == 0) { return HttpNotFound(); } using (db) { db.Entry(model).State = EntityState.Modified; db.SaveChanges(); } return RedirectToAct

【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt,见图1.CreatedBy用来存是谁进行了这次更改.CreatedAt用来存什么时间进行了这次更改.但是这种方式只能保存最后一次进行改动的人和时间.中间的改动历史都不能保留.改动前的值也不能保留. 图 1 对于关键的信息系统,例如银行系统,电商系统,公安系统,我们需要保存数据完整的变动信息和历史.这

Entity Framework学习-实体框架中的code-first迁移

.net开发在涉及到操作数据库时,特别是访问SQL SERVER数据库时,经常需要使用一些ORM框架,最常用,且功能很强大的要数EF了.在使用EF进行涉及数据库的开发时,一般会涉及两种模式:1,DB first;2,Code first.相比前者,Code first比较灵活,适合敏捷开发,特别是数据库表结构经常变动的情况.在使用Code first时,经常会碰到对实体类的改动与数据库同步的问题,这时候我们就需要使用code first中的迁移功能,具体可以参考该文:https://msdn.m

请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?

using dotNET.Core; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; namespace dotNET.EFCoreRepository { /// <summary> /// ef 日志 /// </summary> public class EFLogge

Entity Framework 学习

Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍... 7 Entity Framework 学习初级篇3-- LINQ TOEntities. 10 Entity Framework 学习初级篇4--EntitySQL. 17 Entity Framework 学习初级篇5--ObjectQ

LINQ之路 9:LINQ to SQL 和 Entity Framework(上)

在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的关键特性.在本系列文章中,我不准备事无巨细的讨论LINQ to SQL和Entity Framework的方方面面,毕竟那样需要太多的篇幅,也会让我们从LINQ上面转移注意力,况且,园子里也有不少介绍LINQ to SQL和Entity Framework的好文章.我们在此关注的是LINQ to S

Entity Framework 全面教程详解(转)

目录 预备知识    2 LINQ技术 2 LINQ技术的基础 - C#3.0    2 自动属性    2 隐式类型    2 对象初始化器与集合初始化器    3 匿名类    3 扩展方法    4 Lambda表达式    4 .NET中的数据访问    4 DataSet方案    5 改进的的DataSet方案    5 手写代码通过ADO.NET2.0连接类与数据库交互    5 ORM – LINQ to SQL    6 深入了解Entity Framework    7 En

实体框架- Entity Framework 基础篇

以前写数据层D层的时候里面有好多的SQL语句,如何省略到繁琐的SQL语句,微软提供了一种很好的方式-实体框架-Entity Framwork.一种对象映射机制,支持.NET开发人员使用域特定对象来出来关系数据,消除了对开发人员通常需要编写的大部分数据访问代码的需求. ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.实体框架Entity Framework是ADO.NET中的一组支持开发面向数据的软件

MVC5 Entity Framework学习之异步和存储过程

在之前的文章中,你已经学习了如何使用同步编程模型来读取和更新数据,在本节中你将学习如何实现异步编程模型.异步可以使应用程序执行更有效率,因为它可以更有效的使用服务器资源. 同样在本节中你还将学习如何针对实体的insert, update, 和delete操作使用存储过程. 最后将应用程序部署到 Windows Azure. 下面是完成后的页面 为什么要使用异步代码 一个web服务器的可用线程是有限的,在高负载情况下,所有的可用线程可能都在被使用.当出现这种情况时,服务器将无法处理新的请求,直到有