为什么在未更新的字段上抛出验证异常?

时间:2014-01-02 05:25:44

标签: c# .net entity-framework validation entity-framework-6

我正在使用EF 6.0.2并尝试仅更新实体的Status字段。

var drama = new Drama { Id = id };
using (var ctx = new DataContext()) {
  ctx.Dramas.Attach(drama);
  drama.Status = state;
  ctx.SaveChanges();
}

这会抛出ValidationException:需要ClassName字段。

该实体已存在且有效(包括ClassName)。 Id是实体密钥。

这里发生了什么导致异常被抛出?

2 个答案:

答案 0 :(得分:0)

您说数据库中已存在具有给定Id的实体,您只想更改其Status值?

这不是你在代码中所做的。您已使用给定的Id创建了一个新实体,并仅设置其Status值。这就是为什么抛出ValidationExceptionClassName字段为空,除非您在Drama构造函数中设置它。

要修改现有实体,首先应从数据库中检索它,然后修改它并保存更改:

using (var ctx = new DataContext()) {
    var drama = ctx.Dramas.Single(d => d.Id == id);
    drama.Status = state;
    ctx.SaveChanges();
}

编辑:

如果要模拟编辑分离实体的方案,则仍需要其值有效。在附加实体之前尝试满足所有验证要求(即填写ClassName),然后Attach,更新StatusSaveChanges

var drama = new Drama { Id = id, ClassName = "Dummy" };
using (var ctx = new DataContext()) {
    ctx.Dramas.Attach(drama);
    drama.Status = state;
    ctx.SaveChanges();
}

答案 1 :(得分:0)

当您在EF中进行编辑时,您应该获得正在编辑的整个记录​​,然后将字段放在您想要更新的任何内容中。

using (var ctx = new DataContext()) {
  drama = ctx.Dramas.Where(O => O.Id = id);
  drama.Status = state;
  ctx.Dramas.Attach(drama);
  ctx.SaveChanges();

}

希望这有帮助