Прерывистое «Указанное приведение неверно» с введенным контекстом данных StructureMap - PullRequest
2 голосов
/ 17 января 2011

Я периодически получаю ошибку System.InvalidCastException: Specified cast is not valid. в своем уровне хранилища при выполнении абстрактного запроса SELECT, сопоставленного с LINQ.

Ошибка не может быть вызвана несоответствующей схемой базы данных, поскольку она работает с перебоями и находится на моем локальном компьютере разработчика.

Может ли это быть из-за того, что StructureMap кэширует контекст данных между запросами страниц?Если да, то как мне сказать StructureMap v2.6.1 вводить новый аргумент контекста данных в мой репозиторий для каждого запроса?

Обновление: Я нашел этот вопрос , которыйкоррелирует мое предположение, что что-то использовалось повторно.Похоже, мне нужно вызвать 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 голосов
/ 22 февраля 2011

Возиться с утилизацией репозиториев не помогло, но установка для MultipleActiveResultsets значения true в строке подключения SQL решила проблему.

...