Я периодически получаю ошибку 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