对象的关键信息,不能修改

问题描述 投票:0回答:3

我试图将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);
c# .net asp.net-mvc
3个回答
3
投票

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

简而言之,当你说Appointment appointment = currentAppointment;时,你会创建一个从appointmentcurrentAppointment代表的同一个对象的链接。当您更改任何一个属性时,它将在另一个上更改。

实体框架有一种方法可以将一个类映射到另一个类,如下所示:

// 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的数据库列设置为生成GUID本身的identifier。然后你在C#中的对象在添加时只有一个null ID,其余的在数据库级别完成。


0
投票

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


0
投票

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

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);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.