实体框架5.0 ValidateOnSaveEnabled不工作

本文关键字:工作 ValidateOnSaveEnabled 框架 实体 | 更新日期: 2023-09-27 17:57:45

public void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity
{
    this.Configuration.ValidateOnSaveEnabled = false;
    if (!this.Set<TEntity>().Local.Any(d => d.Id == entity.Id))
    {
        this.Set<TEntity>().Attach(entity);
    }
    this.Set<TEntity>().Remove(entity);
    SaveChanges();
    this.Configuration.ValidateOnSaveEnabled = true;
}

上面的代码在SaveChanges((上引发了一个异常。

[DbUpdateException: Null value for non-nullable member. Member: 'Name'.]

删除实体时如何删除验证?

实体框架5.0 ValidateOnSaveEnabled不工作

不确定这是否是问题所在,但如果使用存根对象删除实体,请尝试将DbEntityEntry.State设置为已删除。我不确定你是否需要关闭validateOnSaveEnabled

public void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity
{
    this.Configuration.ValidateOnSaveEnabled = false;
    TEntity alreadyAttached = this.Set<TEntity>().Local
                                  .FirstOrDefault(d=>d.Id == entity.Id);
    if(alreadyAttached != null) entity = alreadyAttached;
    this.Entry<TEntity>(entity).State = EntityState.Deleted;
    SaveChanges();
    this.Configuration.ValidateOnSaveEnabled = true;
 }

编辑

上面写的内容可能并不完全正确。正如Pawel所指出的,它是DbUpdateException而不是DbEntityValidationException。以上内容可能适用于您的原因是,如果实体是附属的,则需要对案件进行处理。

if(!this.Set<TEntity>().Local.Any(d=>d.Id == entity.Id))
{
    this.Set<TEntity>().Attach(entity);
}
this.Set<TEntity>().Remove(entity);

如果实体已经附加,请考虑此处的情况。不是传递的实体实例(您只是在比较id(,而是表示同一实体的另一个实例。现在考虑一下,如果在此之前您已经在代码中的某个地方修改了这个其他实体,那么它将被上下文跟踪为已修改。然后,您尝试删除传递的实体实例,即未被跟踪的实例,结果是"否"。然后调用savechanges和BAM!DbUpdateException作为EF尝试更新您认为已删除的实体。

您看到的异常与验证无关(您拥有的是DbUpdateException,而不是验证异常(。异常消息表示,当数据库中的列不可为null时,要保存的实体的Name属性为null。(如果启用了验证,您可能会收到验证错误-这就是您试图禁用它的原因吗?(