2016-04-15 9 views
0

Ich benutze Entity Framework (V5 denke ich) und versuche gerade eine neue Zeile in eine Tabelle einzufügen. Die Tabelle, die ich hinzufügen möchte, hat einen zusammengesetzten Primärschlüssel basierend auf dem Wert "PRN" (im Grunde eine eindeutige Kunden-ID) und einer zugehörigen Sequenznummer. Jedes Mal, wenn die Informationen in dieser Tabelle aktualisiert werden, fügen wir eine neue Zeile für den PRN ein und erhöhen die Sequenznummer. Die Sequenznummer ist nicht als automatischer Inkrementierungswert oder IDENTITY in der Datenbank definiert, da sie nicht eindeutig ist - die Sequenznummer ist nur für jeden PRN eindeutig.Fügen Sie eine Entität hinzu, die einen zusammengesetzten Primärschlüssel enthält

Wenn ich den folgenden Code ausführen, bekomme ich eine InvalidOperationException: "Die Eigenschaft 'DDIPhasedPayment_Seq_Num' ist Teil der Schlüsselinformationen des Objekts und kann nicht geändert werden."

EF scheint nichts dagegen zu haben, wenn ich nur den PRN-Teil des Primärschlüssels modifiziere und den Datensatz speichere (was einen Standardwert von Null für Seq_Num ergibt), aber die Ausnahme auslöst, wenn ich versuche, den anderen zu ändern Teil der PK. Wie kann ich eine Tabelle erstellen und hinzufügen, ohne EF zu stören?

var nextSequence = GetNextPhasedPaymentSequenceNumber(message.Prn); 
var entity = new Practitioner_DDI_PhasedPayment() 
{ 
    PRN = message.Prn, 
    DDIPhasedPayment_Seq_Num = nextSequence, 
    TSN = message.Tsn, 
    //........ 
    //Various other fields populated 
    //........ 
}; 
dbContext.Practitioner_DDI_PhasedPayment.Add(entity); 

dbContext.SaveChanges(); 
+1

Sind Sie sicher, dass Sie keinen PK-Wert in 'GetNextPhasedPaymentSequenceNumber' ändern? –

Antwort

0

Gert - Danke für Ihren Hinweis, das war genau das Problem:

private short GetNextPhasedPaymentSequenceNumber(int prn) 
    { 
     var lastPayment = WISERDb.Practitioner_DDI_PhasedPayment.Where(ddipp => ddipp.PRN == prn).OrderByDescending(k => k.DDIPhasedPayment_Seq_Num).FirstOrDefault(); 

     if (lastPayment == null) { return 1; } 

     else { return ++lastPayment.DDIPhasedPayment_Seq_Num; } 
    } 

Die Verwendung des ++ Operators hier war das Problem - es sollte den Wert + 1 anstelle der Rückkehr wurde.