私は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()
と、currentのインスタンスがDbContext
CreateMap()に指定されたクロージャに保存されます。
2回目にページにアクセスしたとき、静的マップはすでに配置されており、現在は破棄されている最初のへの参照を使用していますDbContext
。
正確なエラーは次のとおりです。
The operation cannot be completed because the DbContext has been disposed.
問題は、AutoMapperが最初のコンテキストではなく常に現在のコンテキストを使用するようにするにはどうすればよいですか?
Mapper
静的クラスの代わりにオートマッパーの「インスタンス」を使用する方法はありますか?これが可能な場合は、毎回マッピングを再作成することをお勧めしますか?反射が遅くなるのが心配です。
カスタムリゾルバーについて少し読みましたが、同様の問題が発生します-カスタムリゾルバーに現在のコンテキストを使用させるにはどうすればよいですか?