我正在实现一个导入例程,用户将特定格式的字符串粘贴到输入字段中,然后将其转换为实体,然后放入数据库。
该算法检查实体是否已经存在,并尝试更新它或将其插入数据库。插入工作正常 - 更新失败。
//considered existing if Name and owning user match.
if (db.Captains.Any(cpt => cpt.Name == captain.Name && cpt.User.Id == UserId))
{
var captainToUpdate = db.Captains.Where(cpt => cpt.Name == captain.Name && cpt.User.Id == UserId).SingleOrDefault();
db.Entry(captainToUpdate).CurrentValues.SetValues(captain);
db.Entry(captainToUpdate).State = EntityState.Modified;
await db.SaveChangesAsync();
}
手头的问题是,这样写的,它也尝试更新主键,(captain
Id 是 0,而 captainToUpdate
Id 已经设置) 导致异常 The property 'Id' is part of the object's key information and cannot be modified.
我需要更改什么,才能正确更新实体。如果可以避免,我不想手动更新每个属性,因为表 Captain 包含 30 多列。
最佳答案
你可以做的是首先将船长的Id设置为与captainToUpdate的Id相同:
captain.Id = captainToUpdate.Id;
db.Entry(captainToUpdate).CurrentValues.SetValues(captain);
await db.SaveChangesAsync();
关于c# - 不能 "Add or Update"实体,因为无法更改主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25543567/