【问题标题】:object's key information and cannot be modified对象的关键信息,不能修改
【发布时间】:2018-09-13 20:01:00
【问题描述】:

我正在尝试将 currentAppointment 复制到约会。我的问题是 currentAppointment 有一个 GUID。当我尝试创建一个新的重复约会时,我收到以下错误。 '属性'AppID'是对象的关键信息的一部分,不能修改。 '

这完全有道理,为什么我会收到此错误,我知道我可以通过逐个字段向下匹配它们(32 个字段)来解决它,但我想知道是否有办法提供“约会” ' 一个新的向导,无需逐个字段。

        Appointment currentAppointment = db.Appointments.Find(id);

        Appointment appointment = currentAppointment;

        appointment.AppID = Guid.NewGuid(); (where I get the error since I already have a guid from currentAppointment but would like appointment to have a new one.)
        appointment.AgentID = 1;
        appointment.StatusID = 13;
        db.Appointments.Add(appointment);

【问题讨论】:

  • 你需要阅读reference types(可能还有value types)。您会收到错误,因为appointment 只是指向currentAppointment 所表示的同一对象的指针,如果您更改一个,则更改另一个。 db 是什么?是实体框架还是别的什么?
  • 实体框架
  • 您或许可以考虑使用AsNoTracking 来完成此操作。 stackoverflow.com/questions/15308747/…

标签: c# .net asp.net-mvc


【解决方案1】:

因此,正如我在评论中提到的,您应该阅读 Reference TypesValue Types 以了解为什么会出现此错误。

简而言之,当您说Appointment appointment = currentAppointment; 时,您实际上是在创建从appointmentcurrentAppointment 所代表的同一对象的链接。当您更改其中一个的属性时,它会更改另一个。

Entity Framework 有一种方法可以将一个类映射到另一个类,如下所示:

// Get current Appointment
var currentAppointment = db.Appointments.Find(id);

// Make a brand new Appointment
var appointment = new Appointment();

// Map one to the other
db.Entry(currentAppointment).CurrentValues.SetValues(appointment);

// Change the ID
appointment.AppID = Guid.NewGuid();

// Add to database
db.Appointments.Add(appointment);

// Whatever else happens

// Save
db.SaveChanges();

您可能需要做一些工作以避免冲突,因为约会的 GUID 可能已经存在。

我个人建议将AppId 的数据库列设置为identifier,它会自行生成GUID。然后你在 C# 中的对象在添加时只有一个null ID,其余的在数据库级别完成。

【讨论】:

    【解决方案2】:

    由于该错误,我认为您的 AppID 是您的主键。所以如果这是一个主键,你的 Guid.NewGuid();可以返回数据库中已经存在的值。因此,您可以将其保存在变量中并验证是否存在与该密钥的任何约会,如果不添加,如果存在,您将生成另一个。

    【讨论】:

      【解决方案3】:

      要在循环中创建新对象,您可以使用如下代码:

      foreach (Array element in empList)
      {
        objEmp= new Employee(); // this is the line i wrote to repair error
        objEmp.Name= "EmpName";
        objEmp.Mobile= "012345678942";
        int nextID=getnextIDFunction();
        objEmp.PKID = nextVisitParamID;
        bllEmp.Save(objEmp);
      }
      

      这里的重要部分是您每次都创建一个新对象
      您添加到新对象的值将从旧对象中检索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-12
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多