2017-10-18 13 views
0

Je suis en train de dupliquer currentAppointment au rendez-vous. Mon problème est que currentAppointment a un GUID. Lorsque j'essaie de créer un nouveau rendez-vous en double, j'obtiens l'erreur suivante. 'La propriété' AppID 'fait partie des informations clés de l'objet et ne peut pas être modifiée. '. Cela a tout à fait du sens pourquoi je reçois cette erreur et je sais que je peux la contourner en allant champ par champ et les faire correspondre (32 champs) mais je voudrais savoir s'il y a un moyen de donner ' rendez-vous 'un nouveau guid sans aller champ par champ.informations clés de l'objet et ne peut pas être modifié

 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); 
+1

Vous devez lire (https [types de référence] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types) (et probablement [types de valeur] : //docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/value-types) aussi). Vous obtenez l'erreur parce que 'rendez-vous' est juste un pointeur vers le même objet représenté par' currentAppointment', si vous en changez un, vous changez l'autre. Qu'est-ce que 'db'? Est-ce Entity Framework ou autre chose? – Equalsk

+0

Entity Framework –

+0

Vous pourriez envisager d'utiliser 'AsNoTracking' pour accomplir ceci, peut-être. https://stackoverflow.com/questions/15308747/entity-framework-5-deep-copy-clone-of-an-entity –

Répondre

0

Avec cette erreur, je pense que votre AppID est votre clé primaire. Donc, si c'est une clé primaire, votre Guid.NewGuid(); peut renvoyer une valeur qui existe déjà dans la base de données. Donc, vous pouvez enregistrer cela dans une variable et valider s'il existe un rendez-vous avec cette clé, sinon ajouter, s'il existe, vous en générez un autre.

1

Donc, comme mentionné dans mon commentaire, vous devriez lire environ Reference Types vs Value Types pour comprendre pourquoi vous obtenez cette erreur. En bref quand vous dites Appointment appointment = currentAppointment; vous créez un lien de appointment au même objet que currentAppointment. Lorsque vous modifiez une propriété sur l'une ou l'autre, elle change de l'autre.

Entity Framework a une façon de cartographier une classe sur une autre comme celle-ci:

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

Vous pouvez faire un peu de travail pour éviter la collision, car il y a une chance que le GUID pour la nomination pourrait déjà exister.

Personnellement, je recommande d'avoir la colonne de base de données pour AppId définie comme identifier qui génère le GUID elle-même. Ensuite, votre objet en C# a juste un null ID lorsqu'il est ajouté, le reste est fait au niveau de la base de données.