gpt4 book ai didi

asp.net-mvc - Automapper + EF4 + ASP.NET MVC - 出现 'context disposed' 错误(我知道为什么,但如何修复它?)

转载 作者:行者123 更新时间:2023-12-02 01:25:37 25 4
gpt4 key购买 nike

我在 MVC Controller 操作中有这个非常基本的代码。它映射 Operation模型类非常基本OperationVM View 模型类。

public class OperationVM: Operation 
{
public CategoryVM CategoryVM { get; set; }
}

我需要加载完整的类别列表才能创建 CategoryVM 实例。
这是我(尝试)创建 List<OperationVM> 的方法显示在 View 中。

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() 的闭包中。

我第二次点击页面时,静态 map 已经就位,仍然使用对初始 map 的引用,现已处理,DbContext .

确切的错误是:

The operation cannot be completed because the DbContext has been disposed.

问题是:如何让 AutoMapper 始终使用当前上下文而不是初始上下文?

有没有办法使用自动映射器的“实例”而不是静态 Mapper类(class)?如果可以的话,是否建议每次都重新创建映射?我担心反射速度变慢。

我阅读了一些有关自定义解析器的内容,但遇到了类似的问题 - 如何让自定义解析器使用当前上下文?

最佳答案

这是可能的,但设置有点复杂。我在 Ninject 的帮助下在我的项目中使用它来进行依赖注入(inject)。

AutoMapper有TypeConverters的概念。转换器提供了一种方法来实现在单独的类中转换某些类型所需的复杂操作。如果将 Category 转换为 CategoryVM 需要数据库查找,您可以在自定义 TypeConverter 类中实现该逻辑,类似于:

using System;
using AutoMapper;

public class CategoryToCategoryVMConverter :
TypeConverter<Category, CategoryVM>
{
public CategoryToCategoryVMConverter(DbContext context)
{
this.Context = context;
}

private DbContext Context { get; set; }

protected override CategoryVM ConvertCore(Category source)
{
// use this.Context to lookup whatever you need
return CreateCatVM(source, this.Context.Categories);
}
}

然后,您可以配置 AutoMapper 以使用您的转换器:

Mapper.CreateMap<Category, CategoryVM>().ConvertUsing<CategoryToCategoryVMConverter>();

棘手的部分来了。每次映射值时,AutoMapper 都需要创建转换器的新实例,并且需要为构造函数提供 DbContext 实例。在我的项目中,我使用 Ninject 进行依赖项注入(inject),并将其配置为在处理请求时使用相同的 DbContext 实例。这样,相同的 DbContext 实例就会被注入(inject)到您的 Controller 和 AutoMapper 转换器中。简单的 Ninject 配置如下所示:

Bind<DbContext>().To<SomeContext>().InRequestScope();

您当然可以使用某种工厂模式来获取 DbContext 的实例,而不是将其注入(inject)到构造函数中。

如果您有任何疑问,请告诉我。

关于asp.net-mvc - Automapper + EF4 + ASP.NET MVC - 出现 'context disposed' 错误(我知道为什么,但如何修复它?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11751313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com