解决问题:The context cannot be used while the model is being created
2024-10-19 02:20:35
使用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的子类。
这样,这个异常就消失了,起码在我这里是这样。如果你遇到了这个异常,原因不一样,或者你照上面做了,还是解决不了,欢迎留言探讨。
最新文章
- Windows远程连接Linux
- Android RecyclerView.Adapter notifyDataSetChanged 不起作用
- NodeJS中的异步I/O、事件驱动
- C#八皇后问题 枚举值
- linux终端python自动提示
- .net 的一个分词系统(jieba中文分词的.NET版本:jieba.NET)
- Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)
- Android学习之listview的下拉刷新、上拉载入
- Python爬虫入门:Urllib库的基本使用
- compose合并函数依次执行 - 来源redux
- vue搭建app, M端项目流程
- JS加密对应的c#解码
- C#执行EXE程序
- 关于PS的操作
- jt项目日志查询流程
- ubuntu解压和压缩文件
- SpringBoot 2.SpringBoot整合Mybatis
- e787. 用JSpinner实现小时选择
- class 3 求数组中的最大值(单元测试)
- 深入探索C++对象模型(七)