与StructureMap / ASP.MVC / Visual Studio中/ LinqToSql奇怪的行为 [英] Strange behaviour with StructureMap / ASP.MVC / Visual Studio / LinqToSql

查看:170
本文介绍了与StructureMap / ASP.MVC / Visual Studio中/ LinqToSql奇怪的行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用与StructureMap新的MVC框架最近并整体都有不错的效果,但是,我一直运行到一个很奇怪的错误我无法理解或工作,如何解决。

这是我的架构:


  • 的DbContext - linqToSql数据上下文

  • IRepository - 合同定义数据的方法。

  • IService - 合同定义服务的方法。

  • 控制器 - 两人在这个例子中

因此​​,我有:

 公共类回购:IRepository
{
    公共回购(的DbContext DB)
    {
       .....
    }
}公共类服务:IService
{
    公共服务(IRepository回购)
    {
       .....
    }
}公共类ControllerOne:控制器
{
    公共ControllerOne(IService服务)
    {
       .....
    }
}公共类ControllerTwo:控制器
{
    公共ControllerTwo(IService服务)
    {
       .....
    }
}

StructureMap被用来定义具体类型为IRepository和IService和的DbContext由兰巴前pression构造 - ()=>新的DbContext()由DSL注册表中配置

有一个在present没有的DbContext缓存

走上问题:

我的索引页面加载,使两个同时发生的Ajax请求ControllerOne和ControllerTwo,它是通过从MvcContrib的StructureMap控制器厂建造。

StructureMap被注入混凝土类型IService,而这又是与配置IRepository实例和新的DbContext对象创建的

ControllerOne请求从IService实例,然后将其返回作为JsonActionResult,这是由Newtonsoft.Json呈现的模型

ControllerTwo请求从IService实例,这也是序列化到JSON对象不同的模型时,MVC框架执行的ActionResult。

我通过卡西尼号运行在VS2008的网站。

我现在看到的每一个然后的问题是在LinqToSql从生成错误


  • 数据无法读取,已经有读者打开或

  • 不能数据作为数据已经存在加载到数据表(我没有确切的例外在present手,但都是内部LinqToSql)。

如果错误在ControllerOne发生那么ControllerTwo也会失败,类似的错误,因为如果两个请求与共享对象运行。

它不会出错所有的时间,但它足以让我担心我的体系结构和它的配置错误以某种方式。

有什么办法StructureMap可能会在后续请求返回ControllerOne和ControllerTwo的同一个实例,或者如果它的缓存的DbContext以任何方式?虽然我不要求它?

有没有人的Visual Studio /卡西尼内工作时,见过类似的东西吗?通过IIS帮助中去?

我应该去掉LinqToSql?

进逼Visual Studio和开放又往往可以解决问题了一段时间。

非常感谢,如果任何人都可以对这个问题有何启示。

编辑:包括来自NLOG日志文件记录片段(线程ID是分号前数):

 二零零九年三月二十零日1点四十分32秒12:控制器=时间表,日期= 2001年5月6日,行动=周末度假/测试/时间表/ 2001年5月6日? _dc = 1237513232397
2009年3月20日1点40分32秒10:控制器=时间表,日期= 2001年5月6日,行动=周末度假/测试/时间表/ 2001年5月6日_dc = 1237513232449?
2009年3月20日1点40分32秒10:已经有一个用此命令,必须先关闭相关联的打开的DataReader。 System.InvalidOperationException [BR]在System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(的SqlCommand命令)
   在System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(字符串方法的SqlCommand命令)
   在System.Data.SqlClient.SqlCommand.ValidateCommand(字符串的方法,布尔异步)
   在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,字符串的方法,DbAsyncResult结果)
   在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,字符串方法)
   在System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior行为,串法)
   在System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior行为)
   在System.Data.Common.DbCommand.ExecuteReader()
   在System.Data.Linq.SqlClient.SqlProvider.Execute(前pression查询,QueryInfo queryInfo,IObjectReaderFactory厂,对象[] parentArgs,对象[] userArgs,ICompiledSubQuery []子查询对象的lastResult)
   在System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(前pression查询,QueryInfo [] queryInfos,IObjectReaderFactory厂,对象[] userArguments,ICompiledSubQuery []子查询)
   在System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(前pression查询)
   在System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute [S](前pression前pression)
   在System.Linq.Queryable.Sum [TSource](IQueryable`1源,防爆pression`1选择器)
   在HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(员工员工,日期时间周末度假,的Int32 nonProjectId)
   在HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(员工的雇员,日期时间周末度假)
   在HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter作家,时间表时间表)
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter作家,对象的值,JsonMemberMapping memberMapping)
   在Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter,对象的值)
   在HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext上下文)
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult的的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,的ActionResult的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串actionName)
2009年3月20日1点40分32秒12:无效试图调用时阅读的读者被关闭。 System.InvalidOperationException [BR]在System.Data.Linq.SqlClient.SqlProvider.Execute(前pression查询,QueryInfo queryInfo,IObjectReaderFactory厂,对象[] parentArgs,对象[] userArgs,ICompiledSubQuery []子查询对象的lastResult)
   在System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(前pression查询,QueryInfo [] queryInfos,IObjectReaderFactory厂,对象[] userArguments,ICompiledSubQuery []子查询)
   在System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(前pression查询)
   在System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute [S](前pression前pression)
   在System.Linq.Queryable.Sum [TSource](IQueryable`1源,防爆pression`1选择器)
   在HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(员工员工,日期时间周末度假,的Int32 nonProjectId)
   在HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(员工的雇员,日期时间周末度假)
   在HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter作家,时间表时间表)
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter作家,对象的值,JsonMemberMapping memberMapping)
   在Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter,对象的值)
   在HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext上下文)
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult的的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,的ActionResult的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串actionName)
2009年3月20日1时41分58秒12:控制器=时间表,一个月= 6,年= 2001,行动=日历/测试/时间表/日历/ 6/2001年_dc = 1237513318470
2009年3月20日1点41分59秒10:控制器=时间表,日期= 2001年6月3日,行动=周末度假/测试/时间表/ 2001年6月3日_dc = 1237513318509?
2009年3月20日1点41分59秒12的空值不能分配给类型System.Int32一个成员是一个非空的值类型。 System.InvalidOperationException [BR]在Read_TimesheetEntry(ObjectMaterializer`1)
   在System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   在System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
   在System.Linq.Enumerable.ToList [TSource](IEnumerable`1源)
   在HCD.Intranet.Core.Data.Linq.LinqTimesheetRepository.GetEntries(的Int32 timesheetHeaderId)
   在HCD.Intranet.Core.Services.Impl.TimesheetService.GetEntries(的Int32 timesheetHeaderId)
   在HCD.Intranet.Core.Models.Timesheet.get_InnerEntries()
   在HCD.Intranet.Core.Models.TimeMap..ctor(时间表时间表)
   在HCD.Intranet.Core.Models.Json.TimesheetCalendarJsonConverter.WriteTimesheet(JsonWriter作家,时间表[]时间表)
   在HCD.Intranet.Core.Models.Json.TimesheetCalendarJsonConverter.WriteJson(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter,对象的值)
   在HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext上下文)
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult的的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,的ActionResult的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串actionName)
2009年3月20日1点41分59秒12:控制器=时间表,日期= 2001年6月3日,行动=周末度假/测试/时间表/ 2001年6月3日_dc = 1237513318545?
2009年3月20日1点41分59秒12:已经有一个用此命令,必须先关闭相关联的打开的DataReader。 System.InvalidOperationException [BR]在System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(的SqlCommand命令)
   在System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(字符串方法的SqlCommand命令)
   在System.Data.SqlClient.SqlCommand.ValidateCommand(字符串的方法,布尔异步)
   在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,字符串的方法,DbAsyncResult结果)
   在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,字符串方法)
   在System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior行为,串法)
   在System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior行为)
   在System.Data.Common.DbCommand.ExecuteReader()
   在System.Data.Linq.SqlClient.SqlProvider.Execute(前pression查询,QueryInfo queryInfo,IObjectReaderFactory厂,对象[] parentArgs,对象[] userArgs,ICompiledSubQuery []子查询对象的lastResult)
   在System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(前pression查询,QueryInfo [] queryInfos,IObjectReaderFactory厂,对象[] userArguments,ICompiledSubQuery []子查询)
   在System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(前pression查询)
   在System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute [S](前pression前pression)
   在System.Linq.Queryable.Sum [TSource](IQueryable`1源,防爆pression`1选择器)
   在HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(员工员工,日期时间周末度假,的Int32 nonProjectId)
   在HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(员工的雇员,日期时间周末度假)
   在HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter作家,时间表时间表)
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter作家,对象的值,JsonMemberMapping memberMapping)
   在Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter,对象的值)
   在HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext上下文)
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult的的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,的ActionResult的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串actionName)
2009年3月20日1点41分59秒10:无效试图调用时阅读的读者被关闭。 System.InvalidOperationException [BR]在System.Data.Linq.SqlClient.SqlProvider.Execute(前pression查询,QueryInfo queryInfo,IObjectReaderFactory厂,对象[] parentArgs,对象[] userArgs,ICompiledSubQuery []子查询对象的lastResult)
   在System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(前pression查询,QueryInfo [] queryInfos,IObjectReaderFactory厂,对象[] userArguments,ICompiledSubQuery []子查询)
   在System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(前pression查询)
   在System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute [S](前pression前pression)
   在System.Linq.Queryable.Sum [TSource](IQueryable`1源,防爆pression`1选择器)
   在HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(员工员工,日期时间周末度假,的Int32 nonProjectId)
   在HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(员工的雇员,日期时间周末度假)
   在HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter作家,时间表时间表)
   在HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter作家,对象的值,JsonMemberMapping memberMapping)
   在Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter作家,对象的值)
   在Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter作家,对象的值,JsonConverter memberConverter)
   在Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter,对象的值)
   在HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext上下文)
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult的的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1续)
   在System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,的ActionResult的ActionResult)
   在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串actionName)


解决方案

我是说杰里米米勒关于这一点,你的的要管理与SM分贝上下文的生命 - 让根据需要回购实例化。这presents问题,你会怎么做对象更新/持久性(如果你依赖于上下文的多个请求活着),但它是值得的的靠这个了Web应用程序。

我不得不从店面删除数据库上下文管理的东西像这样的理由 - 我得到的内存泄漏。我不会说这是SM的错 - 但总体而言只是让回购打开一个新的上下文

I have been using the new MVC framework with StructureMap recently and have had good results overall, however, I keep running into a very strange error that I cannot understand or work out how to resolve.

This is my architecture:

  • DBContext - linqToSql data context.
  • IRepository - contract defining data methods.
  • IService - contract defining service methods.
  • Controllers - two in this example.

I therefore have:

public class Repo : IRepository
{
    public Repo(DBContext db)
    {
       .....
    }
}

public class Service : IService
{
    public Service(IRepository repo)
    {
       .....
    }
}

public class ControllerOne : Controller
{
    public ControllerOne(IService service)
    {
       .....
    }
}

public class ControllerTwo : Controller
{
    public ControllerTwo(IService service)
    {
       .....
    }
}

StructureMap is being used to define concrete types for IRepository and IService and the DBContext is constructed by the lamba expression - () => new DBContext() configured by DSL registry.

There is no caching of the DBContext at present

Onto the problem:

My index page loads and makes two simultaneous Ajax requests to ControllerOne and ControllerTwo, which are constructed via the StructureMap controller factory from MvcContrib.

StructureMap is injecting the concrete types of IService, which in turn are created with the configured IRepository instance and a new DBContext object.

ControllerOne is requesting a model from the IService instance, which is then returned as a JsonActionResult, which is rendered by Newtonsoft.Json.

ControllerTwo is requesting a different model from the IService instance, which is also serialised to a Json object when the MVC framework executes the ActionResult.

I am running the website via Cassini in VS2008.

The problem I am seeing every now and then is an error generated from within LinqToSql

  • data cannot be read, there is already a reader open or
  • cannot load data into a data table as the data already exists (I do not have the exact exceptions to hand at present but both are internal to LinqToSql).

If the error happens in ControllerOne then ControllerTwo will also fail with a similar error, as if the two requests are running with shared objects.

It doesn't error all the time but it's enough to make me concerned about my architecture and that it's configured wrong in some way.

Is there any way StructureMap could be returning the same instance of ControllerOne and ControllerTwo on subsequent requests, or if it's caching the DBContext in any way? Even though I am not asking it to?

Has anyone seen anything similar when working within Visual Studio / Cassini? Does going through IIS help?

Should I removed LinqToSql?

Closing down Visual Studio and opening up again can often resolve the problem for a while.

Many thanks if anyone can shed any light on the problem.

EDIT: Including logging snippet from NLog log file (thread id is number before semi colon):

03/20/2009 01:40:32 12: controller=Timesheet,date=2001-05-06,Action=WeekEnding /beta/Timesheet/2001-05-06?_dc=1237513232397 
03/20/2009 01:40:32 10: controller=Timesheet,date=2001-05-06,Action=WeekEnding /beta/Timesheet/2001-05-06?_dc=1237513232449 
03/20/2009 01:40:32 10: There is already an open DataReader associated with this Command which must be closed first. System.InvalidOperationException[br]   at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
   at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
   at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader()
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector)
   at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId)
   at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding)
   at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet)
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping)
   at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
03/20/2009 01:40:32 12: Invalid attempt to call Read when reader is closed. System.InvalidOperationException[br]   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector)
   at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId)
   at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding)
   at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet)
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping)
   at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
03/20/2009 01:41:58 12: controller=Timesheet,month=6,year=2001,Action=Calendar /beta/Timesheet/Calendar/6/2001?_dc=1237513318470 
03/20/2009 01:41:59 10: controller=Timesheet,date=2001-06-03,Action=WeekEnding /beta/Timesheet/2001-06-03?_dc=1237513318509 
03/20/2009 01:41:59 12: The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type. System.InvalidOperationException[br]   at Read_TimesheetEntry(ObjectMaterializer`1 )
   at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at HCD.Intranet.Core.Data.Linq.LinqTimesheetRepository.GetEntries(Int32 timesheetHeaderId)
   at HCD.Intranet.Core.Services.Impl.TimesheetService.GetEntries(Int32 timesheetHeaderId)
   at HCD.Intranet.Core.Models.Timesheet.get_InnerEntries()
   at HCD.Intranet.Core.Models.TimeMap..ctor(Timesheet timesheet)
   at HCD.Intranet.Core.Models.Json.TimesheetCalendarJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet[] timesheets)
   at HCD.Intranet.Core.Models.Json.TimesheetCalendarJsonConverter.WriteJson(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
03/20/2009 01:41:59 12: controller=Timesheet,date=2001-06-03,Action=WeekEnding /beta/Timesheet/2001-06-03?_dc=1237513318545 
03/20/2009 01:41:59 12: There is already an open DataReader associated with this Command which must be closed first. System.InvalidOperationException[br]   at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
   at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
   at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader()
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector)
   at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId)
   at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding)
   at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet)
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping)
   at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
03/20/2009 01:41:59 10: Invalid attempt to call Read when reader is closed. System.InvalidOperationException[br]   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector)
   at HCD.Intranet.Core.Data.Linq.LinqEmployeeRepository.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding, Int32 nonProjectId)
   at HCD.Intranet.Core.Services.Impl.EmployeeService.CalculateHolidaysRemaining(Employee employee, DateTime weekEnding)
   at HCD.Intranet.Core.Models.Timesheet.CalculateHolidaysRemaining()
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteTimesheet(JsonWriter writer, Timesheet timesheet)
   at HCD.Intranet.Core.Models.Json.TimesheetJsonConverter.WriteJson(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.WriteMemberInfoProperty(JsonWriter writer, Object value, JsonMemberMapping memberMapping)
   at Newtonsoft.Json.JsonSerializer.SerializeObject(JsonWriter writer, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeValue(JsonWriter writer, Object value, JsonConverter memberConverter)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at HCD.Intranet.Core.Web.Mvc.NewtonsoftJsonResult.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<InvokeActionResultWithFilters>b__e()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.<InvokeActionResultWithFilters>b__10()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)

解决方案

I was talking to Jeremy Miller about this and you don't want to manage the lifetime of the db context with SM - let the repo instantiate as needed. This presents problems with how you will do object updating/persistence (if you're relying on a context staying alive for more than one request) but it's worth it to not rely on this for a web app.

I had to remove the db context management stuff from the storefront for a reason like this - I was getting memory leaks. I won't say it's SM's fault - but overall just let the repo open a new context.

这篇关于与StructureMap / ASP.MVC / Visual Studio中/ LinqToSql奇怪的行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆