The specified LINQ expression contains references to queries that are associated with different contexts
今天在改写架构的时候,遇到这么个错误。当时单从字面意思,看上去错误是由join的两个不同的表来源不一致引起的。

其中的videoResult和deerpenList均来自与同一个edmx文件,所以两个表的来源不一致导致了错误的发生,这个猜想是不正确的。
正在左右为难之际,在stackoverflow上面发现了一个主题,正好解决了我的难题。这个问题的回答是这样的:
This can happen if your Context property returns a new instance every time
它的字面意思是:如果你的Context每次访问都返回一个新的实例的话,就会造成这个错误。
回想起我之前的构造:
public interface IContext<T>:IDisposable where T:class
{
DbContext DbContext{get;}
IDbSet DbSet{get;}
} public class Context<T>:IContext<T> where T:class
{
public Context()
{
DbContext = new DbContext(ConfigurationManager.ConnectionStrings["GDeerGardenEntities"].ConnectionString);
DbSet = DbContext.Set<T>();
} public void Dispose()
{
DbContext.Dispose();
} public DbContext DbContext { get; private set; }
public IDbSet<T> DbSet { get; private set; }
}
由于每次调用,都会新建一个DbContext,所以导致错误的发生。找到原因所在,就好了,我们只需要利用autofac这个ioc容器就行,使用的时候,从容器拿就行了。
所以打开安装器,输入
install-package autofac.mvc3 -project GDeerParkWeb
然后安装完毕,注入一下:
builder.RegisterGeneric(typeof(Context<>)).As(typeof(IContext<>)).SingleInstance();
本以为这样就没问题了。但是在使用的时候,依然会出现上述的错误。
到底原因在哪里呢? 这次排查的线索都断掉了。
想了好久,最后发现可能是泛型的Context存在问题,为什么呢?
因为在取实例化的时候,按照目前的设计,实例上下文应该是这样取得:
Context<bas_video>, Context<bas_deerpen>.
这样,带来的问题就显而易见了: 这两个上下文会产生两个不同的实例!!!!!!!
为什么会产生两个不同的实例呢? 因为泛型T只是一个占位符,当实例化出来的时候,泛型的上下文当然会拿不同的实例去hold住,这样就会造成在进行join操作的时候,出现开头的错误。
如果真是这样,那么我们把去掉,不就可以了吗?
这次我们的重构如下:
public interface IContext
{
IDbSet<T> DbSet<T>() where T : class;
DbContext DbContext { get; }
} public class Context:DbContext,IContext
{
public Context()
: base("GDeerGardenEntities")
{} public IDbSet<T> DbSet<T>() where T : class
{
return base.Set<T>();
} public new DbContext DbContext
{
get;
private set;
}
}
我们的容器注入如下:
builder.RegisterType<Context>().As<IContext>().SingleInstance();
最后上阵使用,wow,我们的错误消失了,看来最后的推测是对的。
谨以此文,权当抛砖引玉。
The specified LINQ expression contains references to queries that are associated with different contexts的更多相关文章
- ling join 报错The specified LINQ expression contains references to queries that are associated with different cont
The specified LINQ expression contains references to queries that are associated with different cont ...
- [Linq Expression]练习自己写绑定
源代码:TypeMapper.zip 背景 项目中,我们会经常用到各种赋值语句,比如把模型的属性赋值给UI,把视图模型的属性拷贝给Entity.如果模型属性太多,赋值也会变成苦力活.所以,框架编程的思 ...
- Get Argument Values From Linq Expression
Get Argument Values From Linq Expression If you even find yourself unpacking an expression in C#, yo ...
- C# ORM中Dto Linq Expression 和 数据库Model Linq Expression之间的转换
今天在百度知道中看到一个问题,研究了一会便回答了: http://zhidao.baidu.com/question/920461189016484459.html 如何使dto linq 表达式转换 ...
- C# [LINQ] Linq Expression 获取多格式文件
using System; using System.IO; using System.Linq; using System.Linq.Expressions; internal static str ...
- 查看LINQ Expression編譯後的SQL語法(转)
在用了LINQ語法之後的一個月,我幾乎把SQL語法全部拋到腦後了,不過 LINQ好用歸好用,但是實際上操作資料庫的還是SQL語法,如果不知道LINQ語法 編譯過後產生怎樣的SQL語法,一不小心效能就會 ...
- Expression Tree Basics 表达式树原理
variable point to code variable expression tree data structure lamda expression anonymous function 原 ...
- C#中的LINQ
从自己的印象笔记里面整理出来,排版欠佳.见谅! 1.LINQ: 语言集成查询(Language Integrated Query) 实例: var q= from c in catego ...
- 转载: C#: Left outer joins with LINQ
I always considered Left Outer Join in LINQ to be complex until today when I had to use it in my app ...
随机推荐
- iOSQuartz2D-04-手动剪裁图片并保存到相册
实现效果 操作步骤 绘制一个矩形框,弹出一个alertView,提示是否保存图片 点击"是",将图片保存到相册 在相册中查看保存的图片 效果图 实现思路 在控制器的view上添加一 ...
- ASP.NET MVC 在WebService中Token的使用方法
最近发现公司接口的验密方式很简单,就是简单的用户名密码校验.客户方面的负责人说要修改一下,所以想起了微信的验证密码的方式故写了这个Demo以供大家学习参考: 接口:WebService 方式:Toke ...
- 关于移动端的font和图片的问题
一.font-family 使用无衬线字体 body { font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif ...
- DataGridView单元格内容自动匹配下拉显示
页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件.在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信 ...
- 问题解决——SolidWorks 已停止工作 (Windows7 + SolidWorks 2010 SP0.0)
给同事的SolidWorks解决问题时偶然间发现的. -------------------------------------------------------------- 本文原创,转载请注明 ...
- 烂泥: KVM虚拟机Linux系统增加硬盘
本文由秀依林枫提供友情赞助,首发于烂泥行天下. Linux虚拟机在使用过程中,硬盘空间不够使用.由于前期没有做LVM,所以只能手动添加新的硬盘. 给虚拟机添加硬盘有两种方法: 1.通过virsh at ...
- ubuntu16.04下安装openssh-server报依赖错误的解决方法
问题:系统重装后,安装和配置SSH,防火墙配置 #安装install openssh-server sudo apt install openssh-server -y 遇到问题: sudo apt ...
- HDU 3374 String Problem (KMP+最大最小表示)
KMP,在有循环节的前提下: 循环节 t = len-next[len], 个数num = len/(len-next[len]);个人理解,如果有循环节,循环节长度必定小于等于len/2, 换句话说 ...
- JVM 垃圾回收算法
在说垃圾回收算法之前,先谈谈JVM怎样确定哪些对象是“垃圾”. 1.引用计数器算法: 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当 ...
- linux -- read(), write()
read()函数 2011-03-23 16:28:37| 分类: linux | 标签: |字号大中小 订阅 read函数从打开的设备或文件中读取数据. #include <uni ...