Question

Je cherche à ajouter certaines entités que je l'ai créé. Lorsque je tente et ajouter l'entité concernée à l'ensemble (voir code ci-dessous), je reçois l'erreur suivante:

« L'objet ne peut pas être ajouté ou attaché parce que son EntityReference a une valeur de la propriété EntityKey qui ne correspond pas à la EntityKey pour cet objet. »

Je ne peux pas dire ce EntityKey il fait référence à bien. 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'autre information donnée en plus l'erreur quand je trace à travers donc je ne suis même pas sûr de la clé est la question.

EDIT: Voici la version qui a fini de travailler jusqu'à:

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;
    }
}
Était-ce utile?

La solution

Ce code ne me fait beaucoup de sens. Dans deux cas, vous traversez un EntityKey quand vous pouvez simplement attribuer une référence d'objet. I.e., modifiez 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 ferait rien:

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

Vous pouvez simplement se débarrasser d'eux.

Qu'est-ce qui se passe quand vous faites ces deux modifications?

Autres conseils

Hallo,

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

Peut-être que vous devriez essayer de faire la même chose avec stages? Créer un nouveau objet de stages et définir toutes les valeurs que vous avez en les prenant de l'objet internshipToCreate, et que cet objet nouvellement créé passer à la méthode _internshipEntities.AddToInternshipSet.

Il est possible que vous avez défini des valeurs sur l'objet internshipToCreate que vous aviez besoin à d'autres fins, et que certains de ceux qui est à l'origine fait l'exception.

Et, je ne sais pas ce que vous la logique métier est, mais ce serait mieux si vous mettez le tout sous une seule transaction, parce que, comme cela, il peut arriver que deux premières entités sont créées et troisième pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top