前段时间,在公司做项目时,引入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中遇到的坑和解决方案的更多相关文章

  1. Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列

    原文:Entity Framework问题:ReferentialConstraint 中的依赖属性映射由存储生成的列 今天在采用Entity Framework 的Database First反向以 ...

  2. Entity Framework Core 2.0 中使用LIKE 操作符

    Entity Framework Core 2.0 中使用LIKE 操作符 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译 ...

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

    利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码: [HttpPost] public ActionResult Edit(Article mode ...

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

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

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

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

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

    using dotNET.Core; using Microsoft.Extensions.Logging; using System; using System.Collections.Generi ...

  7. Entity Framework 在OrderBy排序中使用字符串

    public static class LinqExtensions { private static PropertyInfo GetPropertyInfo(Type objType, strin ...

  8. 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

    <在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...

  9. 来,给Entity Framework热热身

    先来看一下Entity Framework缓慢的初始化速度给我们更新程序带来的一种痛苦. 我们手动更新程序时通常的操作步骤如下: 1)把Web服务器从负载均衡中摘下来 2)更新程序 3)预热(发出一个 ...

随机推荐

  1. Android Studio中进行单元测试

    写单元测试类 1.创建单元测试文件夹,即新建一个用于单元测试的包,存放单元测试的类. 2.创建一个类如 ExampleTest,注意要继承自InstrumentationTestCase类. 3.创建 ...

  2. phpstorm license 解决

    http://idea.lanyus.com/ sudo vim /etc/hosts 最后添加:  0.0.0.0 account.jetbrains.com 然后把获得的注册码,复制到,licen ...

  3. 自定义函数,根据p个数,自适应剧中效果

    //最后投保进程line-height 自适应居中; function self_adaption(){ $('.last_place').each(function(){ var _this = $ ...

  4. 查看oracle日志文件切换频率

    column avg format 999.99 column day format a6 ) "Total", , )) h0, , )) "h1", , ) ...

  5. 用Apache Spark和TensorFlow进行的深度学习

    原文:https://databricks.com/blog/2016/01/25/deep-learning-with-apache-spark-and-tensorflow.html by Tim ...

  6. Bzoj3481 DZY Loves Math III

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 310  Solved: 65 Description Input Output Sample Input ...

  7. UIToolBar的半透明属性设置

      UIToolBar的半透明属性设置style:Translucent(Ps:长得很像翻译translation)   https://www.evernote.com/shard/s227/sh/ ...

  8. webpack4.x 入门一篇足矣

    前言: webpack4出了以后,一些插件变化很大,和之前的版本使用方式不一样,新手入坑,本篇将介绍如何从一开始配置webpack4的开发版本,对css,js进行编译打包合并生成md5,CSS中的图片 ...

  9. 子DIV块中设置margin-top时影响父DIV块位置的解决办法?

    解决方法: 1.修改父元素的高度,增加padding-top样式模拟(padding-top:1px:常用) 2.为父元素添加overflow:hidden:样式即可(完美) 3.为父元素或者子元素声 ...

  10. list互转datatable 支持Nullable转换

    /// <summary> /// list转datatable /// </summary> /// <param name="list">& ...