实体框架 - 使用导航属性编辑多个实体
本文关键字:实体 编辑 属性 框架 导航 | 更新日期: 2023-09-27 18:31:58
几天以来,我一直在寻找解决问题的方法。我对实体框架相对较新,只是习惯了它。
这是我的问题:
我在MVC中制作了一个Web API ASP.NET。在 API 的一种方法中,我需要更新多个现有记录(相同类型的实体)。该实体具有以下结构:
约会
- GUID (PK) 名称
- (接口的约会名称)
- Team_Creation_FK
- Team_Editing_FK
- Team_Delivery_FK
- Team_Creation(导航属性)
- Team_Editing(导航属性)
- Team_Delivery(导航属性)
此实体可以在不同的部分(创建、编辑、创建)中包含相同的团队。例如,列Team_Creation和Team_Editing可以包含相同的团队(团队:测试(例如))。
所以我更新多条记录的方法如下所示:
public IHttpActionResult EditAppointment(IEnumerable<Appointment> appointments)
{
foreach(Appointment appointment in appointments)
{
appointment.Team_Creation_FK = appointment.Team_Creation != null ? appointment.Team_Creation.GUID: (Guid?)null;
appointment.Team_Editing_FK = appointment.Team_Editing != null ? appointment.Team_Editing.GUID: (Guid?)null;
appointment.Team_Delivery_FK = appointment.Team_Delivery != null ? appointment.Team_Delivery.GUID: (Guid?)null;
db.Entry(appointment).State = EntityState.Modified;
}
db.SaveChanges();
return Ok();
}
但是当我尝试更新不同实体中具有相同团队的实体时,出现以下错误:
EntityFramework 中发生了类型为"System.InvalidOperationException"的异常.dll但未在用户代码中处理。其他信息:附加类型为"Orderus.Models.Team"的实体失败,因为相同类型的另一个实体已具有相同的主键值。使用"附加"方法或将实体的状态设置为"未更改"或"已修改"(如果图形中的任何实体具有冲突的键值)时,可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,请使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改"。
为什么它将导航属性附加到 dbContext?还是我找错地方了?我该如何解决这个问题?
感谢您的帮助,我感谢任何形式的帮助!
更新:
班级预约
public partial class Appointment
{
public System.Guid GUID { get; set; }
public string Name{ get; set; }
public Nullable<System.Guid> Team_Creation_FK { get; set; }
public Nullable<System.Guid> Team_Editing_FK { get; set; }
public Nullable<System.Guid> Team_Delivery_FK { get; set; }
public virtual Team Team_Creation { get; set; }
public virtual Team Team_Editing { get; set; }
public virtual Team Team_Delivery { get; set; }
}
假设约会实体不是新的,并且团队已经存在,那么问题在于您有许多具有相同 I 的团队对象实例。它们代表同一个团队,但实例不同。
因此,当您附加约会时,EF 会附加所有对象图并查找具有相同 ID 的 N 个团队对象。
解决方案:设置约会。Team_xx=null 设置相应的团队 Guid 后。或者更好的是,只需使用团队指导而不是全图发布约会,即可节省网络流量。