我正在尝试将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);
答案 0 :(得分:3)
正如我在评论中所提到的,您应该阅读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,其余的在数据库级别完成。
答案 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);
}
这里的重要部分是您每次创建一个新对象。
您添加到新对象中的值将从旧对象中检索。