前段时间,在公司做项目时,引入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