Estoy tratando de duplicar la cita actual a la cita. Mi problema es que currentAppointment tiene un GUID. Cuando intento crear una nueva cita duplicada, aparece el siguiente error. 'La propiedad' AppID 'es parte de la información clave del objeto y no se puede modificar. '.

Esto tiene mucho sentido por qué recibo este error y sé que puedo solucionarlo yendo campo por campo hacia abajo y emparejándolos (32 campos), pero me gustaría saber si hay una manera de dar un nuevo 'cita' guid sin ir campo por campo.

        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
Alex D 18 oct. 2017 a las 19:03

3 respuestas

La mejor respuesta

Entonces, como mencioné en mi comentario, debería leer sobre Tipos de referencia vs Tipos de valor para entender por qué obtienes este error.

En resumen, cuando dices Appointment appointment = currentAppointment; estás creando un enlace desde appointment al mismo objeto que representa currentAppointment. Cuando cambia una propiedad en cualquiera, cambiará en la otra.

Entity Framework tiene una forma de asignar una clase a otra de esta manera:

// 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();

Es posible que desee hacer un trabajo para evitar la colisión, ya que existe la posibilidad de que el GUID para la cita ya pueda existir.

Personalmente, recomendaría tener la columna de la base de datos para AppId configurada como identifier que genera el GUID en sí. Luego, su objeto en C # solo tiene una identificación null cuando se agrega, el resto se realiza a nivel de la base de datos.

3
Equalsk 18 oct. 2017 a las 16:17

Con ese error, creo que su AppID es su clave principal. Entonces, si esta es una clave principal, su Guid.NewGuid (); puede devolver un valor que ya existe en la base de datos. Por lo tanto, puede guardar eso en una variable y validar si existe una cita con esa clave, si no agrega, si existe, puede generar otra.

0
Jorge Martins 18 oct. 2017 a las 16:15

Para crear nuevos objetos en un bucle, puede usar un código como este:

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

La parte importante aquí es que crea un nuevo Objeto cada vez.
Los valores que agregue al nuevo Objeto se recuperarían de los antiguos.

0
BlueCacti 13 sep. 2018 a las 12:01