我试图将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 vs Value Types的信息,以了解为什么会出现此错误。
简而言之,当你说Appointment appointment = currentAppointment;
时,你会创建一个从appointment
到currentAppointment
代表的同一个对象的链接。当您更改任何一个属性时,它将在另一个上更改。
实体框架有一种方法可以将一个类映射到另一个类,如下所示:
// 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,其余的在数据库级别完成。
有了这个错误,我认为您的AppID是您的主要密钥。所以,如果这是一个主键,你的Guid.NewGuid();可以返回数据库中已存在的值。因此,如果存在与该键的任何约会,您可以将其保存在变量和验证中,如果不存在,则如果存在,则生成另一个。
要在循环中创建新对象,可以使用如下代码:
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的值将从旧的中检索。