2009-09-02 2 views
1

J'essaye d'ajouter quelques entités que j'ai créées. Lorsque j'essaie d'ajouter l'entité en question à l'ensemble (voir code ci-dessous) j'obtiens l'erreur suivante:EntityReference a une valeur de propriété EntityKey qui ne correspond pas?

"L'objet n'a pas pu être ajouté ou joint parce que son EntityReference a une valeur de propriété EntityKey qui ne correspond pas à EntityKey pour cet objet. "

Je ne peux pas dire à quelle entitykey il fait référence cependant. Voici le code, il y a probablement une bien meilleure façon de retirer ceci ainsi:

public Internship CreateInternship(Internship internshipToCreate) 
{ 
    try 
    { 
     Contact contactToCreate = new Contact(); 

     contactToCreate.Fax = internshipToCreate.contacts.Fax; 
     contactToCreate.Extension = internshipToCreate.contacts.Extension; 
     contactToCreate.FirstName = internshipToCreate.contacts.FirstName; 
     contactToCreate.MiddleName = internshipToCreate.contacts.MiddleName; 
     contactToCreate.LastName = internshipToCreate.contacts.LastName; 
     contactToCreate.PhoneNumber = internshipToCreate.contacts.PhoneNumber; 
     contactToCreate.StreetAddress = internshipToCreate.contacts.StreetAddress; 
     contactToCreate.PostalCode = internshipToCreate.contacts.PostalCode; 
     contactToCreate.ContactEmail = internshipToCreate.contacts.ContactEmail; 

     contactToCreate.statesReference.EntityKey = 
        new EntityKey("InternshipEntities.StateSet", "ID", internshipToCreate.contacts.states.ID); 
     contactToCreate.countriesReference.EntityKey = 
        new EntityKey("InternshipEntities.CountrySet", "ID", internshipToCreate.contacts.countries.ID); 

     _internshipEntities.AddToContactSet(contactToCreate); 
     _internshipEntities.SaveChanges(); 

     try 
     { 
      Availability availabilityToCreate = new Availability(); 

      availabilityToCreate.StartDate = internshipToCreate.availability.StartDate; 
      availabilityToCreate.EndDate = internshipToCreate.availability.EndDate; 
      availabilityToCreate.Negotiable = internshipToCreate.availability.Negotiable; 

      _internshipEntities.AddToAvailabilitySet(availabilityToCreate); 
      _internshipEntities.SaveChanges(); 

      try 
      { 
       internshipToCreate.contactsReference.EntityKey = 
        new EntityKey("InternshipEntities.ContactSet", "ID", contactToCreate.ID); 
       internshipToCreate.availabilityReference.EntityKey = 
        new EntityKey("InternshipEntities.AvailabilitySet", "ID", availabilityToCreate.ID); 
       internshipToCreate.classificationsReference.EntityKey = 
        new EntityKey("InternshipEntities.ClassificationSet", "ID", internshipToCreate.classifications.ID); 
       internshipToCreate.educationReference.EntityKey = 
        new EntityKey("InternshipEntities.EducationSet", "ID", internshipToCreate.education.ID); 

       _internshipEntities.AddToInternshipSet(internshipToCreate); //exception here 
       _internshipEntities.SaveChanges(); 

       return internshipToCreate; 
      } 
      catch(Exception e) 
      { 
       throw e; 
      } 
     } 
     catch(Exception e) 
     { 
      throw e; 
     } 
    } 
    catch(Exception e) 
    { 
     throw e; 
    } 

} 

Il n'y a pas d'autres informations données en dehors de l'erreur quand je trace à travers donc je ne suis même pas sûr de la clé est la problème.

EDIT: Voici la version qui a fini par travailler:

using (TransactionScope scope = new TransactionScope()) 
{ 
    try 
    { 
     Contact contactToCreate = new Contact(); 
     Availability availabilityToCreate = new Availability(); 
     Internship i = new Internship(); 

     // Set the contact entity values; 

     contactToCreate.Fax = internshipToCreate.contacts.Fax; 
     //... 
     //ommited for brevity 
     //... 
     contactToCreate.ContactEmail = internshipToCreate.contacts.ContactEmail; 

     // Set the contact entity references to existing tables 

     contactToCreate.statesReference.EntityKey = 
        new EntityKey("InternshipEntities.StateSet", "ID", internshipToCreate.contacts.states.ID); 
     contactToCreate.countriesReference.EntityKey = 
        new EntityKey("InternshipEntities.CountrySet", "ID", internshipToCreate.contacts.countries.ID); 

     // Add contact 

     _internshipEntities.AddToContactSet(contactToCreate); 

     // Set the availability entity values; 

     availabilityToCreate.StartDate = internshipToCreate.availability.StartDate; 
     availabilityToCreate.EndDate = internshipToCreate.availability.EndDate; 
     availabilityToCreate.Negotiable = internshipToCreate.availability.Negotiable; 

     // Add availability 

     _internshipEntities.AddToAvailabilitySet(availabilityToCreate); 

     //Add contact and availability entities to new internship entity 

     i.contacts = contactToCreate; 
     i.availability = availabilityToCreate; 

     // Set internship entity values; 

     i.UserID = internshipToCreate.UserID; 
     //... 
     //ommited for brevity 
     //... 
     i.Created = DateTime.Now; 

     // Set the internship entity references to existing tables 

     i.classificationsReference.EntityKey = 
      new EntityKey("InternshipEntities.ClassificationSet", "ID", internshipToCreate.classifications.ID); 
     i.educationReference.EntityKey = 
      new EntityKey("InternshipEntities.EducationSet", "ID", internshipToCreate.education.ID); 

     // Add internship and save 

     _internshipEntities.AddToInternshipSet(i); 
     _internshipEntities.SaveChanges(); 

     //commit transaction 
     scope.Complete(); 

     return internshipToCreate; 

    } 
    catch (Exception e) 
    { 
     throw e; 
    } 
} 
+0

Quel appel à SaveChanges renvoie l'erreur? –

+0

Le plus à l'essai/catch, _internshipEntities.SaveChanges(); –

Répondre

2

Ce code ne fait pas beaucoup de sens pour moi. Dans deux cas, vous passez par EntityKey lorsque vous pouvez simplement affecter une référence d'objet. I.e., changer ceci:

internshipToCreate.contactsReference.EntityKey = 
    new EntityKey("InternshipEntities.ContactSet", "ID", contactToCreate.ID); 
internshipToCreate.availabilityReference.EntityKey = 
    new EntityKey("InternshipEntities.AvailabilitySet", "ID", availabilityToCreate.ID); 

... à:

internshipToCreate.contacts = contactToCreate; 
internshipToCreate.availability = availabilityToCreate; 

Dans les deux autres cas, vous semblent tenter d'assigner l'ID de l'objet qui est déjà là. Ces deux lignes, même en cas de succès, il me semble, ne rien faire:

internshipToCreate.classificationsReference.EntityKey = 
    new EntityKey("InternshipEntities.ClassificationSet", "ID", internshipToCreate.classifications.ID); 
internshipToCreate.educationReference.EntityKey = 
    new EntityKey("InternshipEntities.EducationSet", "ID", internshipToCreate.education.ID); 

Vous pouvez donc tout simplement se débarrasser d'eux. Que se passe-t-il lorsque vous apportez ces deux modifications?

+0

Merci pour la réponse Craig. Il est maintenant clair que je n'ai pas besoin de définir ces clés manuellement lorsque je crée des entités. Je fais les changements que vous avez postés et je reçois maintenant: un générique: "Une erreur est survenue lors de la mise à jour des entrées.Voir la InnerException pour plus de détails « Les émissions de traces de la pile (voir le commentaire suivant):. –

+0

à System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager StateManager, adaptateur IEntityAdapter) à System.Data.EntityClient.EntityAdapter .Update (IEntityStateManager entityCache) à System.Data.Objects.ObjectContext.SaveChanges (Boolean acceptChangesDuringSave) à System.Data.Objects.ObjectContext.SaveChanges() à Internship.Models.EntityInternshipRepository.CreateInternship (stage internshipToCreate) dans \ Projects \ Internship \ InternshipTest \ Models \ EntityInternshipRepository.cs: line 331 –

+0

Que dit l'InnerException? –

3

Hallo,

bien que je ne suis pas sûr de ce que le problème est que j'ai une suggestion. L'objet Stage que vous transmettez à la méthode (internshipToCreate) est utilisé pour transférer des valeurs vers d'autres entités (Contact, Disponibilité) que vous avez instanciées à l'intérieur de la méthode, et leur création fonctionne correctement.

Peut-être devriez-vous essayer de faire de même avec Internship? Créez un nouvel objet Stage et définissez toutes les valeurs que vous avez en les prenant dans l'objet internshipToCreate, et que cet objet nouvellement créé passe à la méthode _internshipEntities.AddToInternshipSet.

Il est possible que vous ayez défini des valeurs sur l'objet internshipToCreate dont vous aviez besoin à d'autres fins, et que certaines d'entre elles provoquent réellement l'exception. Et, je ne sais pas quelle est votre logique métier, mais il serait préférable que vous mettiez toutes les transactions en une seule fois, car comme cela, il peut arriver que deux premières entités soient créées, et une troisième pas.

+0

Je vais essayer maintenant, merci pour les suggestions. –

+0

Merci Misha, j'ai utilisé votre suggestion et celle de Craig pour que ça marche. À votre santé! –

Questions connexes