实体框架 - 使用导航属性编辑多个实体

本文关键字:实体 编辑 属性 框架 导航 | 更新日期: 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 后。或者更好的是,只需使用团队指导而不是全图发布约会,即可节省网络流量。