1
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'.]

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

4

2 回答 2

2

不确定这是否是问题,但如果您使用存根对象删除实体,请尝试将其设置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 尝试更新您认为已删除的实体时。

于 2013-02-06T03:39:08.947 回答
1

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

于 2013-02-06T17:38:43.423 回答