Linq 断断续续;指定的强制转换无效";使用StructureMap注入数据上下文

Linq 断断续续;指定的强制转换无效";使用StructureMap注入数据上下文,linq,dependency-injection,structuremap,.net,Linq,Dependency Injection,Structuremap,.net,我间歇性地得到一个System.InvalidCastException:指定的强制转换无效。执行用LINQ映射的抽象SELECT查询时,我的存储库层出错 错误不能由不匹配的数据库架构引起,因为它间歇性工作,并且在我的本地开发人员计算机上 可能是因为StructureMap正在页面请求之间缓存数据上下文?如果是这样,我如何告诉StructureMap v2.6.1为每个请求向我的存储库中注入一个新的数据上下文参数 更新:我发现这与我的预感相关,即某些东西正在被重复使用。看起来我需要在注入的数据上

我间歇性地得到一个
System.InvalidCastException:指定的强制转换无效。
执行用LINQ映射的抽象
SELECT
查询时,我的存储库层出错

错误不能由不匹配的数据库架构引起,因为它间歇性工作,并且在我的本地开发人员计算机上

可能是因为StructureMap正在页面请求之间缓存数据上下文?如果是这样,我如何告诉StructureMap v2.6.1为每个请求向我的存储库中注入一个新的数据上下文参数

更新:我发现这与我的预感相关,即某些东西正在被重复使用。看起来我需要在注入的数据上下文上调用Dispose。我不知道如何在不复制粘贴大量代码的情况下对所有存储库执行此操作

编辑:每当我太快刷新本地计算机时,这些错误就会到处出现。在我的远程部署箱上似乎没有发生,但我不能确定

我将所有存储库的StructureMap生命周期更改为
httpContextScope()
,错误仍然存在

代码: 存储库: GetPage可以归结为我的页面存储库中的过滤查询映射

public IQueryable<Page> GetPages()
{
    var pages = from p in _db.Pages
        let categories = GetPageCategories(p.PageId)
        let revisions = GetRevisions(p.PageId)
        select new Page
        {
            ID = p.PageId,
            UserID = p.UserId,
            Slug = p.Slug,
            Title = p.Title,
            Description = p.Description,
            Body = p.Text,
            Date = p.Date,
            IsPublished = p.IsPublished,
            Categories = new LazyList<Category>(categories),
            Revisions = new LazyList<PageRevision>(revisions)
        };

        return pages;
}
WithSlug
只是一个管道过滤器,它将where子句添加到查询中

错误: 堆栈跟踪:
[InvalidCastException:指定的强制转换无效。]
System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询、查询信息查询信息、IOObjectReaderFactory工厂、对象[]parentArgs、对象[]userArgs、ICompiledSubQuery[]子查询、对象lastResult)+4539
System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(表达式查询、查询信息[]查询信息、IOObjectReaderFactory工厂、对象[]用户参数、ICompiledSubQuery[]子查询)+207
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式查询)+500
System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute(表达式)+50
System.Linq.Queryable.FirstOrDefault(IQueryable`1 source)+383
C:\Projects\Manager\Manager\Controllers\SiteController.cs:68中的Manager.Controllers.SiteController.Index()
lambda_方法(闭包、控制器基、对象[])+79
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext,IDictionary`2参数)+258
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor,IDictionary`2参数)+39
System.Web.Mvc.c__显示类d.b__a()+125
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func`1 continuation)+640
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext ControllerContext,IList`1筛选器,ActionDescriptor ActionDescriptor,IDictionary`2参数)+312
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext,String actionName)+709
System.Web.Mvc.Controller.ExecuteCore()+162
System.Web.Mvc.c__显示类8.b__4()+58
System.Web.Mvc.Async.c__显示类1.b__0()+20
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+453
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+371

处理存储库没有帮助,但在我的SQL连接字符串中将MultipleActiveResultsets设置为true解决了问题。

处理存储库没有帮助,但是在我的SQL连接字符串中将MultipleActiveResultsets设置为true解决了这个问题。

向我们展示代码和一些堆栈跟踪。这可能会有帮助。@Steven,用堆栈跟踪和代码更新了问题。这个特定的表格和型号已经几个月没有改变了。这不是孤立的,虽然-我得到这个错误到处都是。这感觉就像一个数据上下文被保存在内存中,几秒钟后一个新的上下文被注入,从而允许查询成功。在
GetPageCategories
GetRevisions
方法中发生了什么。据我所知,当LINQ到SQL没有直接映射时,不能调用本机.NET方法。您是否碰巧将LINQ查询的子查询重构为这些方法?顺便问一下,调用堆栈跟踪中的
FirstOrDefault
方法的代码在哪里。缺少一些代码。@Steven,这些被重构为带有
let
关键字的子查询。我已经为您添加了调用代码。显示代码和一些堆栈跟踪。这可能会有帮助。@Steven,用堆栈跟踪和代码更新了问题。这个特定的表格和型号已经几个月没有改变了。这不是孤立的,虽然-我得到这个错误到处都是。这感觉就像一个数据上下文被保存在内存中,几秒钟后一个新的上下文被注入,从而允许查询成功。在
GetPageCategories
GetRevisions
方法中发生了什么。据我所知,当LINQ到SQL没有直接映射时,不能调用本机.NET方法。您是否碰巧将LINQ查询的子查询重构为这些方法?顺便问一下,调用堆栈跟踪中的
FirstOrDefault
方法的代码在哪里。缺少一些代码。@Steven,这些被重构为带有
let
关键字的子查询。我已经为您添加了呼叫代码。
public IQueryable<Page> GetPages()
{
    var pages = from p in _db.Pages
        let categories = GetPageCategories(p.PageId)
        let revisions = GetRevisions(p.PageId)
        select new Page
        {
            ID = p.PageId,
            UserID = p.UserId,
            Slug = p.Slug,
            Title = p.Title,
            Description = p.Description,
            Body = p.Text,
            Date = p.Date,
            IsPublished = p.IsPublished,
            Categories = new LazyList<Category>(categories),
            Revisions = new LazyList<PageRevision>(revisions)
        };

        return pages;
}
public Page GetPage(string slug)
{
    return _pageRepository.GetPages()
                          .WithSlug(slug).FirstOrDefault();
}
Specified cast is not valid.
Exception Details: System.InvalidCastException: Specified cast is not valid.
[InvalidCastException: Specified cast is not valid.]
   System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +4539
   System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +207
   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +500
   System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute(Expression expression) +50
   System.Linq.Queryable.FirstOrDefault(IQueryable`1 source) +383
   Manager.Controllers.SiteController.Index() in C:\Projects\Manager\Manager\Controllers\SiteController.cs:68
   lambda_method(Closure , ControllerBase , Object[] ) +79
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +125
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709
   System.Web.Mvc.Controller.ExecuteCore() +162
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +58
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371