我正在使用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
是实体密钥。
这里发生了什么导致异常被抛出?
答案 0 :(得分:0)
您说数据库中已存在具有给定Id
的实体,您只想更改其Status
值?
这不是你在代码中所做的。您已使用给定的Id
创建了一个新实体,并仅设置其Status
值。这就是为什么抛出ValidationException
:ClassName
字段为空,除非您在Drama
构造函数中设置它。
要修改现有实体,首先应从数据库中检索它,然后修改它并保存更改:
using (var ctx = new DataContext()) {
var drama = ctx.Dramas.Single(d => d.Id == id);
drama.Status = state;
ctx.SaveChanges();
}
编辑:
如果要模拟编辑分离实体的方案,则仍需要其值有效。在附加实体之前尝试满足所有验证要求(即填写ClassName
),然后Attach
,更新Status
和SaveChanges
:
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();
}
希望这有帮助