今天在改写架构的时候,遇到这么个错误。当时单从字面意思,看上去错误是由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的更多相关文章

  1. 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 ...

  2. [Linq Expression]练习自己写绑定

    源代码:TypeMapper.zip 背景 项目中,我们会经常用到各种赋值语句,比如把模型的属性赋值给UI,把视图模型的属性拷贝给Entity.如果模型属性太多,赋值也会变成苦力活.所以,框架编程的思 ...

  3. Get Argument Values From Linq Expression

    Get Argument Values From Linq Expression If you even find yourself unpacking an expression in C#, yo ...

  4. C# ORM中Dto Linq Expression 和 数据库Model Linq Expression之间的转换

    今天在百度知道中看到一个问题,研究了一会便回答了: http://zhidao.baidu.com/question/920461189016484459.html 如何使dto linq 表达式转换 ...

  5. C# [LINQ] Linq Expression 获取多格式文件

    using System; using System.IO; using System.Linq; using System.Linq.Expressions; internal static str ...

  6. 查看LINQ Expression編譯後的SQL語法(转)

    在用了LINQ語法之後的一個月,我幾乎把SQL語法全部拋到腦後了,不過 LINQ好用歸好用,但是實際上操作資料庫的還是SQL語法,如果不知道LINQ語法 編譯過後產生怎樣的SQL語法,一不小心效能就會 ...

  7. Expression Tree Basics 表达式树原理

    variable point to code variable expression tree data structure lamda expression anonymous function 原 ...

  8. C#中的LINQ

    从自己的印象笔记里面整理出来,排版欠佳.见谅!   1.LINQ: 语言集成查询(Language Integrated Query) 实例: var q=      from c in catego ...

  9. 转载: 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 ...

随机推荐

  1. CoreAnimation-03-隐式动画

    简介 每个UI控件,默认自动创建一个图层(根图层),即每个UI控件对应于至少一个图层 可以手动创建图层,这些图层为非根图层 对非根图层的某些属性(标记为Animatable的属性)进行修改,默认会自动 ...

  2. iOS之UI--UITabBarController

    前言:跟UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是QQ.微信等应用. UITabBarCo ...

  3. Qt安装后配置环境变量(Mac)

    打开终端需要打开配置文件(注意这里不是bash_profile而是 .bash_profile,我开始少了".") 如果bash_profile文件不存在,就会自动创建,然后需要输 ...

  4. javascript中的 类初始化,遍历for in 以及with的用法

    <script type="text/javascript"> function member(name,gender){ this.name=name; this.g ...

  5. linux---文本编辑vi

    本文摘自:鸟哥的linux私房菜

  6. C++中的常量折叠

    先看例子: #include <iostream> using namespace std; int main() { ; int * p = (int *)(&a); *p = ...

  7. FLUSH TABLES WITH READ LOCK

    最近在mysql主从复制中用到锁,翻了资料回忆一下.一下内容参考于:http://blog.csdn.net/arkblue/article/details/27376991 1.FLUSH TABL ...

  8. maven 错误No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format

    [INFO] Scanning for projects... [INFO] ------------------------------------------------------------- ...

  9. 【UXPA工作坊小记】郎学明:做更“有用”的用户研究

    xueminglang@google.com 本来做了一些笔记,但郎老师后来发了相关教材.内容比现场PPT详细的多.由于,本人在网上也没有搜索到相关文章,还是决定做一回码字工,稍作精简后分享给大家. ...

  10. Oracle定义varchar2()类型存储汉字的长度问题

    varchar2最大是4000字节,那么就看你的oracle字符集:(select userenv('language') from dual;)如果字符集是16位编码的,ZHS16GBK,那么每个字 ...