解决问题:The context cannot be used while the model is being created

使用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的子类。

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

posted @   BillySir  阅读(4812)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示