У меня есть этот действительно простой код в действии контроллера MVC. Он отображает класс модели Operation
в очень простой OperationVM
вид -класс модели.
public class OperationVM: Operation
{
public CategoryVM CategoryVM { get; set; }
}
Мне нужно загрузить полный список категорий, чтобы создать экземпляр CategoryVM.
Вот как я (пытаюсь )создать List<OperationVM>
для отображения в представлении.
public class OperationsController : Controller {
private SomeContext context = new SomeContext ();
public ViewResult Index()
{
var ops = context.Operations.Include("blah...").ToList();
Mapper.CreateMap<Operation, OperationVM>()
.ForMember(
dest => dest.CategoryVM,
opt => opt.MapFrom(
src => CreateCatVM(src.Category, context.Categories)
// trouble here ----------------^^^^^^^
)
);
var opVMs = ops.Select(op => Mapper.Map<Operation, OperationVM>(op))
.ToList();
return View(opVMs);
}
}
Все работает отлично в первый раз, когда я попал на страницу. Проблема в том, что объект сопоставления является статическим. Таким образом, при вызове Mapper.CreateMap()
экземпляр текущего DbContext
сохраняется в замыкании, переданном CreateMap ().
Во второй раз, когда я попал на страницу, статическая карта уже на месте, все еще используя ссылку на начальную, теперь удаленную, DbContext
.
Точная ошибка:
The operation cannot be completed because the DbContext has been disposed.
Вопрос в следующем: :Как я могу заставить AutoMapper всегда использовать текущий контекст вместо исходного?
Есть ли способ использовать «экземпляр» automapper вместо статического класса Mapper
? Если это возможно, рекомендуется ли каждый раз -заново создавать сопоставление? Меня беспокоят медленные -спады отражения.
Я немного читал о пользовательских распознавателях, но столкнулся с похожей проблемой -Как заставить пользовательский распознаватель использовать текущий контекст?