使用StructureMap注入的数据上下文,间歇性“指定的强制转换无效”

时间:2011-01-17 11:26:42

标签: linq dependency-injection structuremap .net

在执行使用LINQ映射的抽象System.InvalidCastException: Specified cast is not valid.查询时,我间歇性地在我的存储库层中出现SELECT错误。

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

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

更新:我发现this question与我的预感相关,即重新使用了某些内容。看起来我需要在我注入的数据上下文中调用Dispose。不知道我将如何对所有我的存储库执行此操作,而无需复制大量代码。

编辑:每当我快速刷新本地计算机时,这些错误就会突然出现。看起来不像我的远程部署盒上发生的那样,但我无法确定。

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

代码:

public ActionResult Index()
{
    // error happens here, which queries my page repository
    var page = _branchService.GetPage("welcome"); 
    if (page != null)
    ViewData["Welcome"] = page.Body;
    ...
}

存储库:

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;
}

其中_db是作为参数注入的数据上下文,存储在我为SELECT查询重用的私有变量中。

致电代码:

public Page GetPage(string slug)
{
    return _pageRepository.GetPages()
                          .WithSlug(slug).FirstOrDefault();
}

WithSlug只是一个管道过滤器,它为查询添加了where子句。

错误:

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

1 个答案:

答案 0 :(得分:0)

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