Frage

Ich versuche, einige Einheiten hinzufügen, dass ich geschaffen habe. Als ich die fragliche Einheit zu dem Satz versuchen und füge (siehe Code unten) ich folgende Fehlermeldung erhalten:

„Das Objekt nicht hinzugefügt oder angebracht werden kann, weil seine EntityReference einen EntityKey Eigenschaftswert hat, der nicht die EntityKey für dieses Objekt entspricht.“

Ich kann nicht sagen, was EntityKey es mit Bezug auf though. Hier ist der Code, gibt es wahrscheinlich eine viel bessere Möglichkeit, diese weg zu ziehen, wie gut:

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

}

Es gibt keine andere Informationen außer dem Fehler gegeben, wenn ich Trace durch so bin ich nicht einmal sicher, welche Schlüssel das Problem ist.

EDIT: Hier ist die Version, die Arbeit am Ende:

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;
    }
}
War es hilfreich?

Lösung

Dieser Code ist nicht viel Sinn für mich zu machen. In zwei Fällen, Sie gehen durch eine EntityKey, wenn Sie nur einen Objektverweis zuweisen könnte. Das heißt, ändern diese:

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

... zu:

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

In den beiden anderen Fällen scheinen Sie versuchen zu werden, um die ID des Objekts zuweisen, die bereits vorhanden ist. Diese beiden Linien, auch wenn sie erfolgreich sind, so scheint es mir, würde nichts tun:

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

So kann man nur von ihnen los.

Was passiert, wenn Sie diese beiden Änderungen vornehmen?

Andere Tipps

Hallo,

obwohl ich nicht sicher bin, was das Problem ist, ich habe einen Vorschlag. Das Objekt Praktikum, dass Sie in Verfahren sind vorbei (internshipToCreate) auf Transferwerte an andere Einheiten (Kontakt, Verfügbarkeit) verwendet, dass Sie innerhalb der Methode instanziiert , und ihre Schöpfung funktioniert gut.

Vielleicht sollten Sie versuchen, das gleiche mit Praktikum zu tun? Erstellen Sie neues Praktikum Objekt und stellen Sie alle Werte, die Sie durch haben sie von internshipToCreate Objekt nehmen, und als der neu erstellte Objekt Querpass auf _internshipEntities.AddToInternshipSet Verfahren.

Es ist möglich, dass Sie einige Werte auf internshipToCreate Objekt festgelegt haben, dass Sie für andere Zwecke benötigt wird, und dass einige von denen verursacht tatsächlich die Ausnahme.

Und ich weiß nicht, was Sie Business-Logik, aber es wäre besser, wenn Sie alle unter einer Transaktion setzen, denn wie diese es, dass die ersten beiden Einheiten geschaffen werden kann passieren, und dritter nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top