.net 简易喷油器&x201C;无法完成该操作,因为DbContext已被释放”;在MVC验证期间
我有一个相当复杂的问题。我正在ASP.NET MVC 5项目中使用FluentValidation.MVC。在其中,我使用存储库模式检查用户的电子邮件地址是否重复。问题其实不是存储库模式;这是因为存储库在运行时使用注入构造函数的实体框架上下文:.net 简易喷油器&x201C;无法完成该操作,因为DbContext已被释放”;在MVC验证期间,.net,asp.net-mvc,entity-framework,fluentvalidation,simple-injector,.net,Asp.net Mvc,Entity Framework,Fluentvalidation,Simple Injector,我有一个相当复杂的问题。我正在ASP.NET MVC 5项目中使用FluentValidation.MVC。在其中,我使用存储库模式检查用户的电子邮件地址是否重复。问题其实不是存储库模式;这是因为存储库在运行时使用注入构造函数的实体框架上下文: 公共类存储库 { //IEFContext是我修改T4模板生成的内容 公共存储库(IEFContext上下文) { _上下文=上下文; } } 应用程序使用了这种方法,效果非常好。SimpleInjector连接了我的EF上下文,它的作用域是使用每个A
公共类存储库
{
//IEFContext是我修改T4模板生成的内容
公共存储库(IEFContext上下文)
{
_上下文=上下文;
}
}
应用程序使用了这种方法,效果非常好。SimpleInjector连接了我的EF上下文,它的作用域是使用每个ASP.NET web请求(围绕HttpContext.Items)
Dim-httpLifecycle=New-SimpleInjector.Integration.Web.WebRequestLifestyle(True)
容器寄存器(IEFContext、EFContext的)(httpLifecycle)
这里的应用没有问题,只是验证。当服务器接收到post操作时,我得到的错误是“操作无法完成,因为DbContext已被释放”。我似乎无法在FluentValidation属性中使用任何与EF相关的代码,该属性在每个web请求的基础上使用EF上下文。validation属性没有什么特别之处,它执行以下操作:
公共类Val:AbstractValidator
{
公共Val()
{
_repos=Container.GetInstance();
规则(i=>i.Email)。必须((o,v)=>
{
_Hasdistingtemail回购协议(o.ID,v);
}
}
}
上下文应该与上一个请求一起消失,因为它存储在
HttpContext.Items
中。知道发生了什么吗?我知道通过将WebRequestLifecycle
设置为True,我将导致EF上下文在请求结束时被释放。我认为这是可取的。我最好的选择是V的一个实例al
类在AppDomain(一个单例)期间被缓存,这意味着它的构造函数只被调用一次,因此它只解析一个单例异构体EPOS,导致该repo也被提升为单例(以及它的所有依赖项)
快速修复方法很简单,将GetInstance
调用移动到代理内部:
public Val()
{
规则(i=>i.Email)。必须((o,v)=>
{
repos=Container.GetInstance();
Hasdistingtemail回购协议(o.ID,v);
}
}
就这样!谢谢。