Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 简易喷油器&x201C;无法完成该操作,因为DbContext已被释放”;在MVC验证期间_.net_Asp.net Mvc_Entity Framework_Fluentvalidation_Simple Injector - Fatal编程技术网

.net 简易喷油器&x201C;无法完成该操作,因为DbContext已被释放”;在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

我有一个相当复杂的问题。我正在ASP.NET MVC 5项目中使用FluentValidation.MVC。在其中,我使用存储库模式检查用户的电子邮件地址是否重复。问题其实不是存储库模式;这是因为存储库在运行时使用注入构造函数的实体框架上下文:

公共类存储库
{
//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);
}
}

就这样!谢谢。