Asp.net mvc 3 EF、POCO、DbContext和验证删除

Asp.net mvc 3 EF、POCO、DbContext和验证删除,asp.net-mvc-3,entity-framework-4,dbcontext,Asp.net Mvc 3,Entity Framework 4,Dbcontext,我对MVC和EF的世界还相当陌生,我自己也经历了很多,但有一件事我在网上找不到,那就是人们如何验证“请勿删除”条件 我使用的是使用DbContext T4模板生成的EF4.1数据库第一个POCO类。在我的部分类文件中,我已经用“IValidatableObject”接口修饰了我的所有类,该接口在超出标准元数据属性类型验证的业务规则更改时被调用 我现在需要的是通过相同的机制(因此对UI和控制器是透明的)来检查删除是否正常的验证。我的想法是创建这样一个界面: public interface IDe

我对MVC和EF的世界还相当陌生,我自己也经历了很多,但有一件事我在网上找不到,那就是人们如何验证“请勿删除”条件

我使用的是使用DbContext T4模板生成的EF4.1数据库第一个POCO类。在我的部分类文件中,我已经用“IValidatableObject”接口修饰了我的所有类,该接口在超出标准元数据属性类型验证的业务规则更改时被调用

我现在需要的是通过相同的机制(因此对UI和控制器是透明的)来检查删除是否正常的验证。我的想法是创建这样一个界面:

public interface IDeletionValidation
{
    DbEntityValidationResult ValidateDeletion(DbEntityValidationResult validationResults);
}
…然后在重写中执行此操作,以在DbContext中验证属性

public partial class MyEntityContext
{
   protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        DbEntityValidationResult val = base.ValidateEntity(entityEntry, items);
        if (entityEntry.State == EntityState.Deleted)
        {
            IDeletionValidation delValidationEntity = entityEntry.Entity as IDeletionValidation;
            if (delValidationEntity != null)
                val = delValidationEntity.ValidateDeletion(val);
        }
        return val;
    }
…这为我们提供了验证代码

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> validations = new List<ValidationResult>();

        if (validationContext.IsDelete())
        {
            ....
公共IEnumerable验证(ValidationContext ValidationContext) { 列表验证=新列表(); if(validationContext.IsDelete()) { ....
我不太清楚为什么只为已删除的实体需要一个单独的接口。您可以使用传递给base.ValidateEntity()方法的条目字典,将实体状态(或EntityEntry对象或上下文)传递给IValidatableObject.Validate()方法。请查看“自定义验证示例:Uniqness”通过这种方式,您可以只使用一个接口—IValidatableObject来完成所有操作。 除此之外-默认情况下,EF仅验证添加和修改的实体。如果要验证处于已删除状态的实体,则需要重写DbContext.ShouldValidateEntity()方法,如下所示:

protected override bool ShouldValidateEntity(DbEntityEntry entityEntry)
{
    return entityEntry.Sate == EntityState.Deleted || 
               base.ShouldValidateEntity(entityEntry);
}

我不太清楚为什么只为删除的实体需要一个单独的接口。可以使用传递给base.ValidateEntity()方法的条目字典,将实体状态(或EntityEntry对象或上下文)传递给IValidatableObject.Validate()方法。请看一下“自定义验证示例:Uniqness”通过这种方式,您可以只使用一个接口—IValidatableObject来完成所有操作。 除此之外-默认情况下,EF仅验证添加和修改的实体。如果要验证处于已删除状态的实体,则需要重写DbContext.ShouldValidateEntity()方法,如下所示:

protected override bool ShouldValidateEntity(DbEntityEntry entityEntry)
{
    return entityEntry.Sate == EntityState.Deleted || 
               base.ShouldValidateEntity(entityEntry);
}

对我来说似乎没问题,我为承载我的DB上下文的WCF服务做了类似的事情,它们返回一个FaultException,其中包含中的错误。如果更改的实体返回一个问题,则不会保存更改,服务返回原因。对我来说似乎没问题,我为承载我的DB上下文的WCF服务做了类似的事情,它们返回一个FaultException,其中包含出现错误。如果更改的实体返回问题,则不会保存更改,服务会返回原因。啊……我明白了,这就是我一直在寻找的一种方法;一种将所有验证放在一个位置的更简单的方法。我也没有注意到将自己的数据传递给ValidateEntity的字典,所以我不知道如何分辨(按惯例)验证是一个删除。我认为这有点像番茄/番茄酱,就你想怎么做而言,大量更新/删除的性能应该差不多,但这是我正在寻找的一种替代方法-谢谢!啊…我明白了,这就是我在寻找的那种东西;一种获得所有v的更简单的方法验证到一个地方。我没有注意到将您自己的数据传递给ValidateEntity的字典,所以我不知道如何辨别(在该例程中)验证是一个删除。我认为这有点像番茄/番茄酱,就你想要如何做而言,大量更新/删除的性能应该大致相同,但这是我正在寻找的替代方案-谢谢!
public static class MyExtensions
{
    public static bool IsDelete(this System.ComponentModel.DataAnnotations.ValidationContext validationContext)
    {
        return validationContext.Items.ContainsKey("IsDelete")
                                ? (bool)validationContext.Items["IsDelete"] 
                                : false;
    }
}
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> validations = new List<ValidationResult>();

        if (validationContext.IsDelete())
        {
            ....
protected override bool ShouldValidateEntity(DbEntityEntry entityEntry)
{
    return entityEntry.Sate == EntityState.Deleted || 
               base.ShouldValidateEntity(entityEntry);
}