Asp.net mvc 删除实体会导致验证错误EF6

Asp.net mvc 删除实体会导致验证错误EF6,asp.net-mvc,entity-framework,repository,entity-framework-6,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 {

当我试图使用我的存储库删除实体
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>();
    }
}
公共类RepositoryBase:IDisposable,IRepositoryBase其中T:ModelBase
{
/*其他工作完美的方法*/
公共虚拟整数删除(整数id)
{
尝试
{
T entity=_dataContext.Set().Find(id);
_dataContext.Set().Remove(实体);
返回_dataContext.SaveChanges();
}
捕获(DbEntityValidationException ex)
{
}
}
}
实体:

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>();
    }
}
公共类Produto:ModelBase
{
公共虚拟int?codigommercial{get;set;}
[必需]
[MaxLength(150)]
公共虚拟字符串Nome{get;set;}
[MaxLength(400)]
公共虚拟字符串Ingredientes{get;set;}
[必需]
公共虚拟分类Produto分类{get;set;}
公共产品()
{
Categoria=新的CategoriaProduto();
}
}
公共类CategoriaProduto:ModelBase
{
[必需]
[MaxLength(150)]
公共虚拟字符串Nome{get;set;}
[MaxLength(400)]
公共虚拟字符串描述符{get;set;}
公共虚拟类别Produto CategoriaPai{get;set;}
公共虚拟IList操作空间{get;set;}
公共虚拟corcategoriaprodutenum Cor{get;set;}
公共虚拟布尔简化{get;set;}
[MaxLength(400)]
公共字符串Imagem{get;set;}
公共分类aproduto()
{
Opcoes=新列表();
}
}
我找到了捕获异常的方法,这毫无意义,我尝试删除
产品
,但它声称
CategoriaProduto
的名称为空,是必需的。详情如下:

SaborFit.Data.Model.CategoriaProduto验证失败

  • Nome:需要字段Nome

我搞不懂这个问题。如果我尝试删除
CategoriaProduto
,一切都会顺利。

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

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

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

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