3 Stimmen

Wie erhält man eine noch zu erstellende ID im Linq/Entity Framework

Ich habe zwei solcher Tische:

**Complaint**
-Id
-CreatedBy
-CreatedDate
....

**Solution**
-Id
-ComplaintId

Manchmal hat eine Beschwerde eine sofortige Lösung, d.h. wenn sie erstellt wird, wird auch eine Lösung erstellt. Die Datenbank ist Oracle, und um einen neuen Datensatz in die Datenbank einzufügen, setze ich StoredGeneratePattern auf Identity und verwende einen Trigger, um den Wert einer Sequenz einzufügen.

here my code:    

using (var context = new Entities())
        {
        var complaint = new Complaint
                            {
                                Title = TitleTextBox.Text.Trim(),
                                CreatedBy = CurrentUser.UserID,
                                Description = DescriptionTextBox.Text.Trim(),
                                ServiceId = Convert.ToDecimal(ddlService2.Value),
                                Contact = ContactTextBox.Text.Trim(),
                                CreatedDate = DateTime.Now,
                                Customer = txtUserName.Text.Trim(),
                                ResellerId = CurrentUser.ResellerID,
                                Status = ComplaintStatus.GetStatusCode("New complaint")
                            };
        if (CompletedCheckBox.Checked)
        {
            complaint.Status = ComplaintStatus.GetStatusCode("Completed");
            var solution = new Solution
                               {
                                   CreatedBy = CurrentUser.UserID,
                                   CreatedDate = DateTime.Now,
                                   SolutionDesc = DescriptionTextBox.Text,
                                   ComplaintId = complaint.Id
                               };            
            context.Solutions.AddObject(solution);

        }

            context.Complaints.AddObject(complaint);
            if(context.SaveChanges() > 0)
            {
                ResetFrom();
                return true;
            }

        }

Das Problem ist, dass ich die ID der neu erstellten Beschwerde nicht bekommen kann, um das Feld in der Lösung zu setzen. Wie kann ich das tun?

Ich danke Ihnen.

1voto

MattC Punkte 3914

Könnten Sie den ersten Operationsaufruf nicht ausführen SaveChanges() und fragen Sie dann Ihr Beschwerdeobjekt ab, das nun eine BeschwerdeID haben sollte.

1voto

Matthew Punkte 2180

Wenn Sie einen Trigger/eine Sequenz mit Oracle verwenden, müssen Sie nach dem Speichern der Änderungen ein Get ausführen, um ein Objekt mit der Id zu erhalten. Wenn Sie keinen Trigger verwenden, können Sie die Id manuell für das neue Objekt festlegen, indem Sie den nächsten Wert aus der Sequenz abrufen.

0voto

Wes Grant Punkte 1964

Wenn Sie die Beschwerde hinzufügen und SaveChanges() aufrufen, bevor Sie die Lösung erstellen, hat das Beschwerdeobjekt den Wert Identity, dann fügen Sie es nach der Erstellung der Lösung dem Kontext hinzu und rufen SaveChanges() ein zweites Mal auf.

context.Complaints.AddObject(complaint);

if (CompletedCheckBox.Checked)
    {

        complaint.Status = ComplaintStatus.GetStatusCode("Completed");
        context.SaveChanges();

        var solution = new Solution
                           {
                               CreatedBy = CurrentUser.UserID,
                               CreatedDate = DateTime.Now,
                               SolutionDesc = DescriptionTextBox.Text,
                               ComplaintId = complaint.Id
                           };            
        context.Solutions.AddObject(solution);

    }

        if(context.SaveChanges() > 0)
        {
            ResetFrom();
            return true;
        }

Auch wenn Sie eine Fremdschlüsselbeziehung zwischen der Lösung und der Beschwerde hinzufügen würden, würden Sie die Beschwerde-ID nicht setzen, sondern nur Lösung.Beschwerde = Beschwerde, und die IDs würden beim Speichern korrekt gesetzt werden.

0voto

Mirko Punkte 4254

Die Antwort ist eigentlich ganz einfach. In diesem Fall glaube ich nicht, dass Sie die ID überhaupt benötigen (zumindest nicht nur, um diese Beziehung hinzuzufügen), aber für den Fall, dass Sie dies tun, tun Sie dies:

Stellen Sie sicher, dass Sie die ID auf der Entität "Beschwerde" haben, um beim Einfügen zu aktualisieren (wir verwenden DevArt, aber ich habe den genauen Namen der Einstellung hier vergessen, aber wenn Sie die ID auf der Entität auswählen, sollten Sie einen UpdateMode oder etwas Ähnliches sehen, der auf UpdateOnInsert eingestellt werden muss, glaube ich), dann

Um diese Beziehung einfach einzufügen, gehen Sie wie folgt vor:

using (var context = new MyContext())
{
  var complaint = new Complaint {...};
  context.Complaints.AddObject(complaint);
  var solution = new Solution {..., Complaint = complaint};
  context.Solutions.AddObject(solution);
  context.SaveChanges();
}

Sie werden SaveChanges nicht zweimal ausführen wollen, da dies einen separaten Transaktionsbereich erfordert. Auf diese Weise brauchen Sie es nicht.

0voto

Ryan Punkte 4242

Sie können die Beschwerde zu der Navigationseigenschaft "Beschwerde" der Lösungen hinzufügen.

Erstellen Sie also Ihr Lösungsobjekt, wie Sie es gerade tun, und gehen Sie dann wie folgt vor:

Soltion.Complaint = newCreatedComplaintObject;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X