我正在使用带有DbContext和POCO实体的Entity Framework 5.0。有一个简单实体包含3个属性:
public class Record
{
public int Id { get; set; }
public string Title { get; set; }
public bool IsActive { get; set; }
}
标题字段始终不可更改,UI仅显示它而不提供任何输入框以修改它,这就是为什么当表单发送到服务器时,标题
字段被设置为null
的原因。
以下是我告诉EF如何执行实体(仅针对IsActive
字段)的部分更新:
public class EFRepository<TEntity>
{
...
public void PartialUpdate(TEntity entity, params Expression<Func<TEntity, object>>[] propsToUpdate)
{
dbSet.Attach(entity);
var entry = _dbContext.Entry(entity);
foreach(var prop in propsToUpdate)
contextEntry.Property(prop).IsModified = true;
}
}
调用代码:
repository.PartialUpdate(updatedRecord, r => r.IsActive);
调用SaveChanges
方法时,我遇到了DbEntityValidationException
异常,告诉我Title
是必需的。当我设置dbContext.Configuration.ValidateOnSaveEnabled = false
时,一切都正常。
是否有办法避免在整个上下文中禁用验证,并告诉EF不要验证未更新的属性?
提前致谢。
var person = new Person { Id = 5 }; dbSet.Attach(person); dbSet.Entry(person).Property(p => p.IsDeleted).IsModified = true; dbContext.SaveChanges();
也会导致相同的异常。DbContext验证是否能够很好地处理存根实体?我想避免仅为标记而从数据库中检索整个实体。 - SkogdbSet.Attach(entity); dbContext.Entry(entity).State = EntityState.Modified; dbContext.SaveChanges();
将更新整个实体。如果您明确告诉EF要更新哪些属性,则只会更新这些属性。dbSet.Attach(entity); dbContext.Entry(entity).Property(e => e.Title).IsModified = true; dbContext.SaveChanges();
将仅更新标题。在禁用验证的情况下,这可以很好地工作。 - Skogentity.IsActive = false
),但是目前我没有将其标记为已更新(e => e.IsActive).IsModified = true;
),因此它不会被更新。entity.State = EntityState.Modified
一次性将整个实体标记为已更新。 - Skog