对象的关键信息,无法修改

时间:2017-10-18 16:03:05

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

我正在尝试将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);

3 个答案:

答案 0 :(得分: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,其余的在数据库级别完成。

答案 1 :(得分:0)

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

答案 2 :(得分: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);
}

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