使用Entity Framework (v6.1.3)突然遇到这个问题了,之前一直好好的,怎么破?

此处省略了多次在“好”与“坏"的项目中试验的过程(苦啊),直接给出答案。答案是:没有按DbContext的机制来进行DbSet的实例化导致的。(我遇到的情况)

我们一般在自己的DbContext里这样写

public DbSet<MyEntity1> MyEntity1Set { get; set; }

这样就没问题,不用为MyEntity1Set实例化,就能直接使用,基类帮做了实例化工作。

问题出在,如果我们在自己的DbContext的构造方法或其它地方自己做实例化,后面的代码(比如运行到ToList()的时候)就很可能出现标题的异常。

DbContext并不是只能创建DbSet<>类型的属性,而是提供了一个virtual的Set<>方法  DbSet<TEntity> Set<TEntity> 。允许我们override来修改这个实例化的过程,即是说,所有DbSet实例化,都应该在此方法中进行。前面说的”基类帮做了实例化工作“也是调用Set<>方法。

但是,也有人在在这个方法中通过反射把当前DbContext对象的对应的属性值作为Set<>方法的返回值,这个是非常违背DbContext.Set<>的机制,非常不可取的。

原因搞清楚,解决起来就简单了。如果只是用原本的DbSet就不用override这个Set<>方法,也不用自己实例化了。如果要使用自己的类型(就像我用MockDbSet)代替DbSet,只需要这样写:

public override DbSet<TEntity> Set<TEntity>()
{
return new MockDbSet<TEntity>();
}

当然了,MockDbSet是DbSet的子类。

这样,这个异常就消失了,起码在我这里是这样。如果你遇到了这个异常,原因不一样,或者你照上面做了,还是解决不了,欢迎留言探讨。

解决问题:The context cannot be used while the model is being created的更多相关文章

  1. EF DbContext 并发执行时可能出现的问题

    现在许多Web项目都使用了IOC的DI注入组件.其中对象的生命周期管理是非常重要的. 有时我们为了提高请求的响应,经常在请求线程中执行多个子线程,然而忽略了EF的DbContext的生命周期管理. D ...

  2. Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解

    返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...

  3. 使用Entity Framework出错

          在使用的过程中,写了一个例子,结果就报错说      The context cannot be used while the model is being created.      在 ...

  4. EF--model is being created异常

    使用EF的时候出现了下面的异常,我使用了TASK和saveChangeAsync()异步 The context cannot be used while the model is being cre ...

  5. [转载]Difference between <context:annotation-config> vs <context:component-scan>

    在国外看到详细的说明一篇,非常浅显透彻.转给国内的筒子们:-) 原文标题: Spring中的<context:annotation-config>与<context:componen ...

  6. [转载]Context and Interception : The .NET Context

    转载自:Context and Interception : The .NET Context Every new app domain starts with a single context, c ...

  7. <context:annotation-config> 和 <context:component-scan>的差别

    <context:annotation-config> is used to activate annotations in beans already registered in the ...

  8. Android面试收集录18 Android Context详解

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

  9. Context都没弄明白,还怎么做Android开发?

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

随机推荐

  1. C#设置文件权限

    在开发中,我们经常会使用IO操作,例如创建,删除文件等操作.在项目中这样的需求也较多,我们也会经常对这些操作进行编码,但是对文件的权限进行设置,这样的操作可能会手动操作,现在介绍一种采用代码动态对文件 ...

  2. 一张图看懂normal,static,sealed,abstract 的 区别

    +-------------------------+---+--------+--------+--------+----------+ | Class Type | | normal | stat ...

  3. 跟我学PHP第二篇- 配置Mysql以及PHP WampServer篇(1)

    大家好,昨天我给大家介绍了如何去安装ZEND STUDIO,下面昨天文章的链接: http://www.cnblogs.com/kmsfan/p/zendStudio.html 本节为配置的第一部分, ...

  4. O2O的实时搜索引擎

    O2O行业通常都会基于地理位置派发用户订单给距离最近的服务提供者,因此必须解决位置高效索引和快速检索的问题.位置索引的最大挑战是位置可能持续变化,因此索引的更新量会非常庞大,传统搜索引擎难以应对. 我 ...

  5. jQuery-1.9.1源码分析系列(二)jQuery选择器续1

    在分析之前说一点题外话. ownerDocument和 documentElement的区别 ownerDocument是Node对象的一个属性,返回的是某个元素的根节点文档对象:即document对 ...

  6. 关于log4net日志的配置流程

    最近又重新整理一下log4net日志的配置,现在记录一下流程和一些遇到的问题,以备后续使用,具体的配置参数等信息.此文无,见谅! 1. 下载log4net.dll文件(网上很多,随便找一个!) 2. ...

  7. repeater三级嵌套绑定

    <asp:Repeater ID="rpt1" runat="server" onitemdatabound="rpt1_ItemDataBou ...

  8. Ajax制作智能提示搜索

    一.效果图: 二.实现过程: 思路: 三.部分代码: html: <div id="searchbox"> <div><input type=&quo ...

  9. nodejs定义函数的方法

    test_163:/home/exenode/part3/module_exports # more calc.js module.exports = { sum:function() { var r ...

  10. GJM :C#开发 异步处理是目的,多线程是手段

    但是BeginAccept和EndAccept不就是system.net.socket封装好的异步socket吗如果用多线程来实现的话那就不叫异步了吧 1.再次强调,异步是目的,多线程是手段. 所谓异 ...