5

Tôi đã sử dụng khung MVC mới với StructureMap gần đây và có kết quả tốt, tuy nhiên, tôi tiếp tục chạy vào một lỗi rất lạ mà tôi không thể hiểu hoặc làm việc cách giải quyết.Hành vi lạ với StructureMap/ASP.MVC/Visual Studio/LinqToSql

Đây là kiến ​​trúc của tôi:

  • DBContext - linqtosql bối cảnh dữ liệu.
  • IRepository - các phương thức dữ liệu xác định hợp đồng.
  • IService - phương thức dịch vụ xác định hợp đồng.
  • Bộ điều khiển - hai trong ví dụ này.

do đó tôi có:

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 đang được sử dụng để xác định các loại bê tông cho IRepository và IService và DBContext được xây dựng bởi các biểu lamba -() => DBContext mới() cấu hình bởi DSL đăng ký.

Không có bộ nhớ đệm của DBContext hiện nay

Onto vấn đề:

tải trang index của tôi và thực hiện hai yêu cầu Ajax đồng thời để ControllerOne và ControllerTwo, được xây dựng thông qua các nhà máy điều khiển StructureMap từ MvcContrib.

StructureMap đang tiêm các loại IService cụ thể, lần lượt được tạo bằng cá thể IRepository đã định cấu hình và đối tượng DBContext mới.

ControllerMột người đang yêu cầu một mô hình từ cá thể IService, sau đó được trả về dưới dạng JsonActionResult, được Newtonsoft.Json trả về.

ControllerTwo đang yêu cầu một mô hình khác từ cá thể IService, cũng được sắp xếp theo thứ tự đối tượng Json khi khung MVC thực thi ActionResult.

Tôi đang chạy trang web qua Cassini trong VS2008.

Vấn đề tôi nhìn thấy tất cả bây giờ và sau đó là một lỗi phát sinh từ bên trong LinqToSql

  • dữ liệu không thể đọc, đã có một người đọc mở hoặc
  • không thể tải dữ liệu vào một bảng dữ liệu như dữ liệu đã tồn tại (tôi không có ngoại lệ chính xác để bàn tay hiện tại nhưng cả hai đều nằm bên trong LinqToSql).

Nếu lỗi xảy ra trong ControllerOne thì ControllerTwo cũng sẽ thất bại với lỗi tương tự, như thể hai yêu cầu đang chạy với các đối tượng dùng chung.

Không phải lúc nào cũng có lỗi nhưng nó đủ khiến tôi quan tâm đến kiến ​​trúc của tôi và nó được cấu hình sai theo một cách nào đó.

Có cách nào StructureMap có thể trả về cùng một thể hiện của ControllerOne và ControllerTwo trên các yêu cầu tiếp theo hoặc nếu nó lưu bộ nhớ đệm DBContext theo bất kỳ cách nào? Mặc dù tôi không yêu cầu nó?

Có ai nhìn thấy bất cứ điều gì tương tự khi làm việc trong Visual Studio/Cassini không? Liệu IIS có giúp được không?

Tôi có nên xóa LinqToSql không?

Đóng Visual Studio và mở lại lần nữa thường có thể giải quyết được sự cố trong một thời gian.

Rất cám ơn nếu có ai có thể làm sáng tỏ vấn đề.

EDIT: Bao gồm đoạn khai thác gỗ từ log file NLog (thread id là số trước Dấu chấm phẩy):

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) 
+0

Bạn có thể đăng cấu hình và cấu hình bản đồ cấu trúc của mình không? – Schneider

+0

PS Đây là ngoại lệ chắc chắn được gây ra bởi một dbcontext đang được tái sử dụng. Tôi đã có lỗi tương tự một lần khi dbcontext duy nhất được chia sẻ bởi nhiều yêu cầu (~ chủ đề) – Schneider

Trả lời

6

Tôi đã nói chuyện với Jeremy Miller về điều này và bạn không muốn quản lý thời gian tồn tại của bối cảnh db với SM - để cho repo khởi tạo khi cần. Điều này trình bày vấn đề với cách bạn sẽ làm đối tượng cập nhật/kiên trì (nếu bạn đang dựa vào ngữ cảnh sống sót cho nhiều hơn một yêu cầu) nhưng nó có giá trị là không dựa vào điều này cho một ứng dụng web.

Tôi phải xóa nội dung quản lý ngữ cảnh của db khỏi mặt tiền cửa hàng vì lý do như thế này - tôi đã bị rò rỉ bộ nhớ. Tôi sẽ không nói đó là lỗi của SM - nhưng nói chung chỉ để cho repo mở một bối cảnh mới.

+0

Cảm ơn Rob, điều đó rất thú vị. Quản lý DbContext dựa trên mã cửa hàng phía trước. Có thêm thông tin nào để giải thích vấn đề này và cách bạn xác định nó không? Tôi sẽ kiểm tra đây là giải pháp tối nay và nguồn cấp dữ liệu trở lại. –

+0

Trong trường hợp của tôi, repo của tôi đang tạo mới DBContext của riêng họ mỗi khi repo được tạo ra (ví dụ như bằng tay trong hàm tạo, không sử dụng 'using() {}' theo mã cửa hàng), để repo đã được chia sẻ và không được tạo mới. – ChadT

+0

@Rob - Tôi đã sửa lỗi của bạn và có vẻ như đã sắp xếp sự cố nhưng tôi lại thấy nó vào tối qua. Repo của tôi bây giờ xây dựng DbContext của riêng nó ở mức hàm dựng. Tôi đang nghĩ đến việc chuyển nó sang mức phương thức trong một câu lệnh sử dụng. @DaRKoN - Bạn có gặp phải vấn đề của mình không? –

1

Add:

MultipleActiveResultSets=True 

Để kết thúc chuỗi kết nối của bạn (giả sử MSSQL 2005 +)

Để làm điều này cho ngữ cảnh LINQ của bạn: Mở tab thuộc tính -> Mở rộng kết nối -> Nhấp vào "..." trên 'Chuỗi kết nối' -> 'Nâng cao' -> 'MultipleActiveRe sultSets '-> đúng.

Tôi đã tự giải quyết vấn đề này ngay hôm nay và kiến ​​trúc của tôi gần như giống hệt nhau (tiết kiệm cho sự hiệp nhất thay vì bản đồ cấu trúc). Bao gồm cả hai bộ điều khiển được tải thông qua JS!

+0

@DaRKoN - cảm ơn. Bạn có giải thích thêm về lý do tại sao đây là giải pháp không? tức là những gì LinqToSql đang làm? Tôi sẽ mong đợi một truy vấn LINQ để mở trình đọc và đóng nó lại. Không nên có người đọc mở kết nối. Không có cuộc gọi dữ liệu đồng bộ nào, tất cả đều nằm trong chuỗi đơn. –

+1

Tôi có thể sai, nhưng do tiêm phụ thuộc, hai hành động điều khiển đang chia sẻ cùng một datacontext. JS yêu cầu cả hai gần như cùng một lúc, do đó, có một cơ hội một yêu cầu vẫn mở khi yêu cầu khác đến. Id muốn nghe suy nghĩ của bạn về điều này quá – ChadT

+0

Tôi sẽ ngạc nhiên nếu đây là trường hợp như cả hai bộ điều khiển đang được tạo ra bởi các đối tượng container, mà sẽ sử dụng một DBContext khác nhau cho mỗi một. Tôi mong đợi các phụ thuộc để xếp tầng như các phiên bản mới. NHƯNG một số bộ nhớ đệm như thế này phải xảy ra một nơi nào đó để dẫn đến lỗi tôi đang nhận được –

2

Một lỗi phổ biến khi sử dụng vùng chứa DI với ASP.NET MVC là nhiều vùng chứa DI mặc định thành mẫu Singleton. Tôi không biết nếu đó là trường hợp ở đây, nhưng bạn nên kiểm tra lại. ASP.NET MVC yêu cầu bộ điều khiển được tạo trên mọi yêu cầu bởi vì nó có trạng thái yêu cầu và ngữ cảnh.

+0

Cảm ơn Phil nhưng tôi muốn nói rằng các bộ điều khiển đang được tạo ra theo yêu cầu - Tôi chỉ sử dụng nhà máy điều khiển MvcContrib có dây theo các ví dụ của họ. Các phương thức ObjectFactory.GetInstance từ StructureMap trả về các cá thể mới của kiểu được yêu cầu. Tôi sẽ tiếp tục đào! –

+0

Phil, cảm ơn vì đã làm được điều này. Tôi đã được ấn tượng (tôi chắc chắn rằng tôi đọc nó ở đâu đó) rằng container DI của tôi đã được thiết lập để được theo yêu cầu theo mặc định và nó quay ra nó không phải. – ChadT

+0

@Haacked Structure Map mặc định là bản đồ mới mỗi lần. Bạn có biết nếu các trường hợp tái sử dụng mvccontrib (hoặc mvc)? – eglasius

1

Bạn có hoàn toàn chắc chắn không có gì trong phân cấp đối tượng đang được lưu trong bộ nhớ cache hoặc có cấu hình suốt đời không? Tôi có một ứng dụng sản phẩm có cấu hình giống như sau:

ForRequestedType<SomeDataContext>().TheDefault.Is.ConstructedBy(
     () => new SomeDataContext(someConnString); 

Nó không sử dụng asp.net MVC. Về vấn đề phạm vi, nếu bạn chưa thiết lập bất cứ điều gì, bản đồ cấu trúc sẽ mặc định cho PerRequest (không yêu cầu asp.net nhưng yêu cầu bản đồ cấu trúc, như từng cuộc gọi .GetInstance) - http://structuremap.sourceforge.net/Scoping.htm. Nếu bạn tích cực trên không có cấu hình để ảnh hưởng đến nó, sau đó xem xét liệu các contrib mvc hoặc cái gì khác có thể được tái sử dụng trường hợp.


Về thông tin ngoại lệ được đăng. Lỗi này bao gồm kết hợp các kết quả hành động, các bộ lọc kết quả hành động, tuần tự hóa json, các phương thức tùy chỉnh và cũng một cuộc gọi linq2sql không thành công do một null không mong muốn. Đó là một sự kết hợp của nhiều phần khác nhau, một số trong đó tôi không biết. Tôi sẽ chơi an toàn hơn và di chuyển các công cụ tính toán (mà các cuộc gọi vào linq2sql) được gọi là khi làm serialization đến một nơi khác, nơi các mảnh kết quả serialization/hành động json không tham gia.Đây chỉ là một dự đoán hoang dã, như tôi không biết làm thế nào/khi những miếng được gọi là và loại hành động họ có nội bộ.

+0

@Freddy - cảm ơn. vấn đề đã trở lại vì vậy tôi quay trở lại để tìm một vấn đề phạm vi. Các đối tượng xây dựng mà mvc đang sử dụng các cuộc gọi GetInstance mỗi khi một bộ điều khiển được yêu cầu - làm thế nào điều này sẽ làm việc với phạm vi? Tôi sẽ nhận được cùng một trường hợp bộ điều khiển hai lần? Tôi nghi ngờ điều này đang xảy ra. –

+0

@Tim vì đã qua một thời gian, vui lòng đăng các ngoại lệ bạn đang nhận được. Cũng xem xét việc chạy nó bằng cách sử dụng nguồn mvc contrib. Tôi không biết nhiều về contrib mvc, tôi duyệt nó một chút và tôi đã tự hỏi nếu subcontrollers có thể gây ra một cái gì đó như thế này (bạn đã không đề cập đến những suy nghĩ). – eglasius

+0

@Tim khi bạn gỡ lỗi nó với nguồn, thiết lập một điểm ngắt trên constructor ngữ cảnh, và chạy với nó để xem nơi/khi nó được khởi tạo. – eglasius