我正在使用 FluentValidation 库对我的一个模型强制执行唯一约束:
public class Foo {
// No two Foos can have the same value for Bar
public int Bar { get; set; }
}
public class FooValidator : AbstractValidator<Foo> {
public FooValidator(ApplicationDbContext context) {
this.context = context;
RuleFor(m => m.Bar)
.Must(BeUnique).WithMessage("Bar must be unique!");
}
private readonly ApplicationDbContext context;
public bool BeUnique(int bar) {
return !context.Foos.Any(foo => foo.Bar == bar);
}
}
ApplicationDbContext
使用 StructureMap 注入(inject)值。为了确保在每个请求结束时处理上下文,我尝试调用 ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
在 EndRequest
我的应用程序的处理程序。不幸的是,它看起来好像
Application_EndRequest
在我的验证器类能够完成其工作之前调用方法,并且在时间 FooValidator.BeUnique
之前处理上下文被执行。有没有更好的方法来使用 FluentValidation 库执行依赖于数据库的验证,或者是将这个逻辑移到其他地方( Controller 操作、数据库本身或其他地方)的唯一解决方案?
最佳答案
也许验证器不是 http 范围的(但单例)并且它没有重新创建/注入(inject)新的上下文?在这种情况下,它会尝试使用来自先前请求的已处置上下文。
关于entity-framework - 将 DbContext 注入(inject) FluentValidation 验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7098327/