c# - 不能 "Add or Update"实体,因为无法更改主键

标签 c# entity-framework entity-framework-6

我正在实现一个导入例程,用户将特定格式的字符串粘贴到输入字段中,然后将其转换为实体,然后放入数据库。

该算法检查实体是否已经存在,并尝试更新它或将其插入数据库。插入工作正常 - 更新失败。

//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/

相关文章:

javascript - 如何将列表从 C# Angular 传递到 Angular Controller ?

c# - 如何使用 CString Reference 调用非托管 C++ DLL

c# - Windows Phone 8.1 应用程序中的后台线程

c# - Entity Framework 保存了太多的子实体

c# - Entity Framework - CommitFailureHandler.ClearTransactionHistory()

c# - 无法将类型为 'System.__ComObject' 的 Com 对象转换为接口(interface)类型 VsRunningDocumentTable4

c# - 在 ASP.NET Core 中测量异步与同步代码的性能

c# - DbContext继承更新-数据库错误

c# - Entity Framework 6 迁移与 MVC 6 RC 1

c# - EF6 - 使用基类属性的派生类中的 TPH 外键映射