实体框架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'.]
删除实体时如何删除验证?
不确定这是否是问题所在,但如果使用存根对象删除实体,请尝试将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。(如果启用了验证,您可能会收到验证错误-这就是您试图禁用它的原因吗?(