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

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

最新文章

  1. Windows远程连接Linux
  2. Android RecyclerView.Adapter notifyDataSetChanged 不起作用
  3. NodeJS中的异步I/O、事件驱动
  4. C#八皇后问题 枚举值
  5. linux终端python自动提示
  6. .net 的一个分词系统(jieba中文分词的.NET版本:jieba.NET)
  7. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)
  8. Android学习之listview的下拉刷新、上拉载入
  9. Python爬虫入门:Urllib库的基本使用
  10. compose合并函数依次执行 - 来源redux
  11. vue搭建app, M端项目流程
  12. JS加密对应的c#解码
  13. C#执行EXE程序
  14. 关于PS的操作
  15. jt项目日志查询流程
  16. ubuntu解压和压缩文件
  17. SpringBoot 2.SpringBoot整合Mybatis
  18. e787. 用JSpinner实现小时选择
  19. class 3 求数组中的最大值(单元测试)
  20. 深入探索C++对象模型(七)

热门文章

  1. IOS 开发中要注意的事项
  2. objective-c 语法快速过(8)
  3. 关于客户端接口分页sql语句
  4. SQL Server里的闩锁耦合(Latch Coupling)
  5. 开始编写CSS
  6. CDH集群主节点宕机恢复
  7. LINQ(集成化查询)
  8. 2、Python运算符与表达式
  9. [moka同学笔记]php 获取时间(今天,昨天,三天内,本周,上周,本月,三年内,半年内,一年内,三年内)
  10. 【PHP资源】PHP 资源大全