Domanda

Sto tentando di aggiungere alcune entità che ho creato. Quando provo e aggiungi l'entità in questione al set (vedi codice qui sotto) ottengo il seguente errore:

"L'oggetto non può essere aggiunto o attaccato perché la sua EntityReference ha un valore di proprietà EntityKey che non corrisponde alla EntityKey per questo oggetto".

Non posso dire che cosa EntityKey si riferisce a se. Ecco il codice, probabilmente c'è un modo molto migliore per tirare fuori questo così:

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

}

Non c'è altra informazione fornita oltre l'errore quando traccio attraverso così io non sono nemmeno sicuro che Key è il problema.

EDIT: Ecco la versione che ha finito per lavorare:

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;
    }
}
È stato utile?

Soluzione

Questo codice non sta facendo un sacco di senso per me. In due casi, si sta andando attraverso un EntityKey quando si può solo assegnare un riferimento a un oggetto. Cioè, modificare in questo modo:

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

... a:

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

Negli altri due casi sembrano essere il tentativo di assegnare l'ID dell'oggetto che è già lì. Queste due linee, anche in caso di successo, mi sembra, non avrebbe fatto nulla:

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

Quindi, si può semplicemente sbarazzarsi di loro.

Che cosa succede quando si fanno queste due modifiche?

Altri suggerimenti

Ciao,

anche se non sono sicuro di quale sia il problema è che ho un suggerimento. L'oggetto Stage che si passa in modalità (internshipToCreate) viene utilizzato per trasferire i valori ad altri soggetti (Contatti, disponibilità) che si istanziato all'interno del metodo , e la loro creazione funziona bene.

Forse si dovrebbe cercare di fare lo stesso con stage? Crea nuovo oggetto Stage e impostare tutti i valori che avete prendendoli da oggetto internshipToCreate, e di quella oggetto appena creato passare al metodo _internshipEntities.AddToInternshipSet.

E 'possibile che hai impostato alcuni valori in oggetto internshipToCreate che avete avuto bisogno per altri scopi, e che alcuni di questi è effettivamente causando l'eccezione.

E, non so quello che la logica di business è, ma sarebbe meglio se si mettono tutti in una transazione, perché in questo modo può accadere che si creano prime due entità, e la terza non uno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top