删除实体会导致验证错误EF6

时间:2014-03-20 18:31:42

标签: asp.net-mvc entity-framework repository entity-framework-6

当我尝试使用我的存储库删除实体Produto时,我遇到了一个奇怪的问题。

通用存储库:

public class RepositoryBase<T> : IDisposable, IRepositoryBase<T> where T : ModelBase
{
    /*Other Methods that work perfectly*/

    public virtual int Delete(int id)
    {
        try
        {
            T entity = _dataContext.Set<T>().Find(id);

            _dataContext.Set<T>().Remove(entity);

            return _dataContext.SaveChanges();
        }
        catch(DbEntityValidationException ex)
        {

        }
    }
}

实体:

public class Produto : ModelBase
{
    public virtual int? CodigoComercial { get; set; }

    [Required]
    [MaxLength(150)]
    public virtual string Nome { get; set; }

    [MaxLength(400)]
    public virtual string Ingredientes { get; set; }

    [Required]
    public virtual CategoriaProduto Categoria { get; set; }

    public Produto()
    {
        Categoria = new CategoriaProduto();
    }
}

public class CategoriaProduto : ModelBase
{
    [Required]
    [MaxLength(150)]
    public virtual string Nome { get; set; }
    [MaxLength(400)]
    public virtual string Descricao { get; set; }
    public virtual CategoriaProduto CategoriaPai { get; set; }
    public virtual IList<OpcaoIngrediente> Opcoes { get; set; }
    public virtual CorCategoriaProdutoEnum  Cor { get; set; }
    public virtual  bool Simples { get; set; }
    [MaxLength(400)]
    public string Imagem { get; set; }

    public CategoriaProduto()
    {
        Opcoes = new List<OpcaoIngrediente>();
    }
}

我找到了捕获异常的方法,这没有任何意义,我尝试删除 Product,但它声称CategoriaProduto的名称为空,这是必需的。如下:

  

SaborFit.Data.Model.CategoriaProduto验证失败

     
      
  • Nome:Nome是必需的。
  •   

我无法弄清楚这个问题。如果我尝试删除CategoriaProduto,一切顺利。

1 个答案:

答案 0 :(得分:4)

我不知道你为什么在大多数字段中使用Virtual属性,这导致延迟加载,显然你会遇到验证错误< strong>任何操作,您调用整个实体,如.Find()操作数。你必须首先决定你想做什么!我不喜欢的另一个解决方案是禁用保存更改验证:

context.Configuration.ValidateOnSaveEnabled = false;
context.SaveChanges();