我有一个API,可以在其中POST一个对象并更新数据库中的匹配记录。该端点如下所示:
// POST: api/Spell
public IHttpActionResult Post([FromBody]Spell spell)
{
using (SpellContext db = new SpellContext())
{
var recordToUpdate = db.Spells.Where(x => x.id == spell.id).FirstOrDefault();
if (recordToUpdate != null)
{
recordToUpdate = spell;
db.SaveChanges();
return Ok("Spell " + spell.id + " (" + spell.name + ") Updated Successfully!");
}
else
{
return InternalServerError();
}
}
}
所以基本上只要存在与传入咒语具有相同ID的咒语,我们就会保存更改。
当我调用它时,我返回Ok,但数据库中没有任何更新。
为什么?
答案 0 :(得分:1)
从数据库中获取的法术实例与DbContext分离。
public IHttpActionResult Post([FromBody]Spell spell)
您需要将实体状态显式设置为Modified
if (recordToUpdate != null)
{
// Not needed: recordToUpdate = spell;
db.Entry(spell).State = EntityState.Modified;
db.SaveChanges();
return Ok("Spell " + spell.id + " (" + spell.name + ") Updated Successfully!");
}
请注意,只要它们具有相同的实体键,您就不需要将spell明确指定给recordToUpdate。
答案 1 :(得分:0)
我的问题是我需要单独设置每个参数,而不是仅仅将一个对象设置为另一个。
更新了API调用:
public IHttpActionResult Post([FromBody]Spell spell)
{
using (SpellContext db = new SpellContext())
{
var recordToUpdate = db.Spells.Where(x => x.id == spell.id).FirstOrDefault();
if (recordToUpdate != null)
{
recordToUpdate.name = spell.name;
recordToUpdate.desc = spell.desc;
recordToUpdate.higher_level = spell.higher_level;
recordToUpdate.page = spell.page;
recordToUpdate.range = spell.range;
recordToUpdate.components = spell.components;
recordToUpdate.material = spell.material;
recordToUpdate.ritual = spell.ritual;
recordToUpdate.duration = spell.duration;
recordToUpdate.concentration = spell.concentration;
recordToUpdate.casting_time = spell.casting_time;
recordToUpdate.level = spell.level;
recordToUpdate.school = spell.school;
recordToUpdate.class_name = spell.class_name;
db.SaveChanges();
return Ok("Spell " + spell.id + " (" + spell.name + ") Updated Successfully!");
}
else
{
return InternalServerError();
}
}
}