在 MVC 中对实体进行自定义验证我实现了 IValidatableObject
接口(interface)。
现在,在验证代码中,如果正在创建实体,我想做一些事情,如果正在更新,我想做一些不同的事情。以下面的代码为例,我想要什么:
public partial class ActividadProyecto : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (IsBeingCreated)
{
// Do stuff
}
else if(IsBeingUpdated)
{
// Do other stuff
}
}
}
这有可能吗?我已经搜索了很多,但还没有接近这个。我找到的唯一解决方案是为创建过程制作一个 ViewModel,为更新过程制作另一个 View 模型,然后为它们制作独立的验证器:这是非常错误和丑陋的。
提前致谢!
最佳答案
通过重写 DbContext
中的 ValidateEntity()
方法,您可以通过以下方式将所需信息传递给实体的 Validate()
方法validationContext.Items
字典对象。
数据库上下文:
public class YourDbContext : DbContext
{
// other code
protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
items["is_data_layer"] = true;
items["is_insert"] = this.Entry(entityEntry.Entity).State == EntityState.Added;
return base.ValidateEntity(entityEntry, items);
}
}
来自您的实体的用法:
public partial class ActividadProyecto : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
object dummy;
// skip logic if "Validate" is not called from EF...
if (validationContext.Items.TryGetValue("is_data_layer", out dummy))
{
if ((bool)validationContext.Items["is_insert"]) // insert mode
{
// Do stuff
}
else // update mode
{
// Do other stuff
}
}
}
}
编辑:
我承认我是从纯 EF(数据层)的角度回答的。我不是 ASP.NET MVC 专家。但正如 mo.esmp
指出的那样,如果您还使用 EF 实体作为“ View 模型”,那么 MVC 框架将也调用Validate()
方法来验证 View 层中的实体。并且只有之后 EF 才会调用Validate
方法。这样就可以解释为什么您的实体的 Validate
方法在上下文的 ValidateEntity
方法之前被调用。
因此,问题就变成了:对于添加的逻辑,您对哪种验证感兴趣?你想在“ View 层”验证中添加逻辑吗?或者您想在“数据层”(EF) 验证期间应用您的逻辑?
我没有足够的细节来为您回答这个问题。但是,如果您只需要在“数据层”(EF) 验证阶段添加逻辑,那么我已经调整了上面的示例代码以在 EF 未调用验证时跳过逻辑。您可以尝试一下。
关于c# - EF 验证上下文 : How to know if entity is being created or updated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150122/