Ich erhalte diesen Fehler beim Schreiben in die Datenbank:
Eine abhängige Eigenschaft in einer ReferentialConstraint wird einer vom Speicher generierten Spalte zugeordnet. Spalte: 'PaymentId'.
public bool PayForItem(int terminalId, double paymentAmount,
eNums.MasterCategoryEnum mastercategoryEnum, int CategoryId, int CategoryItemId)
{
using (var dbEntities = new DatabaseAccess.Schema.EntityModel())
{
int pinnumber = 0;
long pinid = 1; //getPinId(terminalId,ref pinnumber) ;
var payment = new DatabaseAccess.Schema.Payment();
payment.CategoryId = CategoryId;
payment.ItemCategoryId = CategoryItemId;
payment.PaymentAmount = (decimal)paymentAmount;
payment.TerminalId = terminalId;
payment.PinId = pinid;
payment.HSBCResponseCode = "";
payment.DateActivated = DateTime.Now;
payment.PaymentString = "Payment";
payment.PromotionalOfferId = 1;
payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid;
//payment.PaymentId = 1;
dbEntities.AddToPayments(payment);
dbEntities.SaveChanges();
}
return true;
}
Das Schema lautet:
c#
sql-server-2008
linq-to-sql
entity-framework-4
Walisischer König
quelle
quelle
(e as System.Data.Entity.Infrastructure.DbUpdateException).Entries
) überprüfen , können Sie sehen, welche Tabelle den Primärschlüssel enthält, auf den verwiesen wird.Dieser Fehler besagt, dass Sie eine nicht unterstützte Beziehung verwenden oder einen Fehler in Ihrer Zuordnung haben. Ihr Code hat höchstwahrscheinlich absolut nichts mit dem Fehler zu tun.
Der Fehler bedeutet, dass Sie eine Beziehung zwischen Entitäten haben, bei denen die Fremdschlüsseleigenschaft in der abhängigen Entität als generierter Speicher definiert ist. Im Geschäft generierte Eigenschaften werden in die Datenbank eingetragen. EF unterstützt das Speichern von generierten Eigenschaften als Fremdschlüssel (sowie berechnete Eigenschaften in Primärschlüsseln) nicht.
quelle
PaymentID
und rufen Sie sie auf.Ich hatte das gleiche Problem. Basierend auf den hier gegebenen Antworten konnte ich es verfolgen und lösen, aber ich hatte ein seltsames Problem, das unten beschrieben wurde - es könnte jemandem in der Zukunft helfen.
In meinen abhängigen Tabellen wurden die Fremdschlüsselspalten auf StoreGeneratedPattern = "Identity" gesetzt. Ich musste es auf "Keine" ändern. Leider hat dies im Designer überhaupt nicht funktioniert.
Ich habe in der vom Designer generierten XML (SSDL) gesucht und diese Eigenschaften waren noch vorhanden, sodass ich sie manuell entfernt habe. Ich musste auch die Spalten in der Datenbank reparieren (entfernen Sie die Identität (1,1) aus CREATE TABLE SQL)
Danach ging das Problem weg.
quelle
Ich hatte das gleiche Problem und nach einigem Eingraben in das Tabellendesign in SQL Server stellte ich fest, dass ich fälschlicherweise den Primärschlüssel der Tabelle auch als Fremdschlüssel festgelegt habe.
In diesem Bild sehen Sie, dass JobID der Primärschlüssel der Tabelle, aber auch fälschlicherweise ein Fremdschlüssel ist.
quelle
Mein Problem wurde durch die redundante Definition des Primärschlüssels in der Konfiguration verursacht.
Entfernen Sie diese Linie
Beispiel http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx
Dies reicht aus, um die Beziehung zu definieren
quelle
Überprüfen Sie die Beziehung zwischen Zahlung und den anderen Tabellen / Entitäten erneut. Einschließlich derjenigen, die PaymentId nicht enthalten sollten, da sich dort das Problem höchstwahrscheinlich versteckt.
Beim Erstellen von Fremdschlüsseln in SQL Server Management Studio wird standardmäßig der Primärschlüssel verwendet. Diese Standardeinstellung wird beim Ändern der übergeordneten Tabelle zurückgesetzt. Achten Sie daher darauf, die Werte im Fenster "Tabellen und Spalten" in der richtigen Reihenfolge zu ändern.
Nachdem Sie die problematische Beziehung behoben haben, besteht eine gute Chance, dass eine einfache "Aktualisierung" des Modells die fehlerhafte Beziehung nicht korrekt aus dem Modell entfernt und Sie den gleichen Fehler auch nach der " Korrektur " erhalten. Tun Sie dies im Modell selbst, bevor Sie eine Aktualisierung durchführen. (Ich habe das auf die harte Tour herausgefunden.)
quelle
Wenn Sie Ihre Beziehungen überprüft haben und dort gut sind.
Löschen Sie die Tabelle im edmx und aktualisieren Sie sie dann aus der Datenbank. Dadurch sparen Sie sich das Update manuell.
quelle
Für mich war es ein falsch platzierter Fremdschlüssel in der Tabelle, aber selbst nachdem ich die Tabelle geändert hatte, um ihn zu reparieren, funktionierte er immer noch nicht. Sie müssen die EDMX-Dateien aktualisieren (und nicht genug, um die Tabelle aus dem Modell zu "aktualisieren", müssen Sie die Tabelle entfernen und erneut im Modell hinzufügen).
quelle
Neben der akzeptierte Antwort, wenn Sie EF Reverse - POCO - Generator oder ein anderes Werkzeug verwenden , die Ihre POCO erzeugt, stellen Sie sicher , dass Sie regenerieren sie!
quelle
In meinem Fall wurde das Problem durch eine wechselseitige 1: 1-Beziehung verursacht:
Ich musste einfach einen der beiden Fremdschlüssel entfernen (sowieso nicht notwendig).
quelle
In meinem Fall war es einfach so, dass ich keine richtigen Berechtigungen für die Datenbank hatte. Ich hatte nur Lesezugriff gelesen und das Entity-Framework gab mir einen ReferentialConstraint-Fehler, der mich abschreckte. Zusätzliche Schreibberechtigungen hinzugefügt und alles war gut.
quelle
In meinem Fall hatte ich eine datenbankgenerierte Eigenschaft und eine ForeignKey-Navigationseigenschaft eingerichtet, um auf eine 1: 1-bezogene Tabelle zu verweisen.
Dies konnte ich nicht entfernen. Ich musste in der Lage sein, sowohl den Primärschlüssel der Entität als datenbankgeneriert festzulegen als auch die 1: 1-Tabelle als Navigationseigenschaft zu referenzieren.
Ich bin mir nicht sicher, ob dies für andere gleich ist, aber dieses Problem trat nur beim Erstellen einer neuen Entität auf. Beim Lesen oder Bearbeiten vorhandener Entitäten wurde das Problem nicht angezeigt. Daher habe ich das Problem umgangen, indem ich eine geerbte Version meines Kontexts erstellt und verwendet habe Die Fluent-Methode zum Ausschalten der Navigationseigenschaft beim Erstellen.
Meine ursprüngliche Entität sah also so aus:
Also habe ich einen speziellen vererbten Kontext erstellt, der so aussah:
und änderte dann den Code, der die neue Entität erstellt hat, um den Benutzer zum neuen Kontexttyp zu machen
Hoffe das hilft jemandem
quelle
In meinem Fall ID-Feld, das FK nur im Entity Framework hat, wurde die Eigenschaft "StoreGeneratedPattern" auf "Itentity" anstelle von "None" gesetzt.
quelle