码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2018-07-04 01:18:59      阅读:815      评论:0      收藏:0      [点我收藏+]

标签:创建过程   注册   怎么   过程   企业号   http   model1   compile   好的   

前段时间,在公司做项目时,引入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的源码,以寻找更好的解决方案。

 

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

标签:创建过程   注册   怎么   过程   企业号   http   model1   compile   好的   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!