web-dev-qa-db-de.com

Fehler 3002: Problem beim Zuordnen von Fragmenten | c # linq to entity

Ich habe eine Konsolenanwendung und versuche jedes Mal, wenn die Anwendung ausgeführt wird, Datum und Uhrzeit an eine Tabelle in meiner Datenbank zu senden.

Die Tabellenstruktur ist wie folgt:

FTPRuns

ID int

Last Run datetime

Einfach genug.

Ich habe die model.edmx in meiner Anwendung ebenfalls aktualisiert, um diese neue Änderung zu berücksichtigen. Jetzt wird jedoch der folgende Fehler angezeigt, und ich bin nicht ganz sicher, was dies bedeutet.

Fehler 3002: Problem beim Zuordnen von Fragmenten ab Zeile 1330: Mögliche Laufzeitverletzung der Schlüssel (FTPRuns.ID) der Tabelle: Spalten (FTPRuns.ID) werden den Eigenschaften (FTPRuns.ID) von EntitySet FTPRuns auf der konzeptionellen Seite zugeordnet, dies jedoch nicht bilden Sie die Schlüsseleigenschaften des EntitySet (FTPRuns.ID, FTPRuns.LastRun).

Hier ist der Codeausschnitt, mit dem ich die Datenbank auch aktualisiere:

 using (ModelContainer ctn = new ModelContainer())
            {
                try
                {
                    FTPRun ftp = new FTPRun
                    {
                        LastRun = DateTime.Now
                    };

                    ctn.FTPRuns.AddObject(ftp);

                    int changes = ctn.SaveChanges();

                    Console.WriteLine(changes.ToString() + " Changes saved");
                    Console.WriteLine("The LastRun Date Has Been Updated");
                }
                catch (InvalidOperationException ex)
                {
                     Console.WriteLine(ex.ToString());
                }
            }

Wenn mir jemand helfen kann wäre ich sehr dankbar :)

vielen Dank.

58
109221793

Ihr Entitätsmodell hat die Kombination der beiden Eigenschaften FTPRuns.ID Und FTPRuns.LastRun Als Entitätsschlüssel, während Ihre Tabelle nur die Spalte FTPRuns.ID Als Primärschlüssel hat. In Ihrem Modell geben Sie also an, dass die Kombination von FTPRuns.ID Und FTPRuns.LastRun Eindeutig sein muss, während Ihre Datenbank die strengere Anforderung hat, dass FTPRuns.ID Alleine eindeutig sein muss.

Schließen Sie einfach die Eigenschaft FTPRuns.LastRun Vom Entitätsschlüssel aus. Möglicherweise geschah dies aus Versehen, oder das Entity Framework konnte keine Primärschlüsselinformationen aus der Datenbank abrufen und musste auf den Entitätsschlüssel schließen. Beispielsweise haben Ansichten keinen Primärschlüssel, und das Entity Framework leitet den Entitätsschlüssel als Kombination aller nicht nullwertfähigen Spalten ab.

93

Daniel Brückner Lösung hat bei mir perfekt funktioniert! Unten ist im Wesentlichen, was er angewiesen hat, aber in grafischer Form - was den faulen Lesern helfen kann :).

Worauf Sie achten möchten, ist, dass Ihre PK im Modell, d. H.

enter image description here

Wir können sehen, dass ich einen PK namens id habe. Wenn ich mir jetzt mein EF-Modell anschaue:

enter image description here

Ich kann nur 1 angegebenen Schlüssel sehen, was korrekt ist. Für mich war das nicht der Fall, alle 4 Spalten waren Schlüssel.

Wenn Sie mit der rechten Maustaste auf die Spalte klicken (im EF-Diagramm in VS), erhalten Sie die Option, das Kästchen Entity Key: Anzukreuzen bzw. abzukreuzen.

enter image description here

Stellen Sie sicher, dass dies Ihrem Modell entspricht. In meinem Fall sollte nur id angekreuzt, gespeichert und das Projekt erstellt werden.

42
benscabbia

das ist mir passiert, als ich das Schlüsselfeld in der Tabelle (in der Datenbank) geändert und das Entitätsmodell aktualisiert habe.

Der alte Schlüssel war noch im Modell vorhanden, daher habe ich die Eigenschaften des Objekts in der EDMX-Datei überprüft und den Schlüssel auf "Falsch" gesetzt. Das hat es behoben.

19
KevinDeus

Ich habe die Tabelle aus dem edmx gelöscht (auf edmx wähle die Tabelle aus, die das Problem verursacht -> Rechtsklick -> Löschen) und führe dann "Aktualisiertes Modell aus der Datenbank" aus

das hat es für mich behoben

15
Dush

Ich habe die Entität und die Klasse aus dem Modellbrowser gelöscht und ein Update von der Datenbank durchgeführt, um sicherzustellen, dass die Tabelle ausgewählt ist. Dies löste das Problem für mich.

5
Mitch Stewart

Ich habe vergessen, beim Erstellen einer neuen Tabelle einen Primärschlüssel festzulegen, und bin deshalb zu SQL Management Studio gegangen, um dies zu tun. Danach habe ich die model.edmx-Datei aktualisiert, um die Änderungen wiederzugeben, und den 3002-Fehler erhalten.

Bei der Aktualisierung des Modells wurden alle Spalten der Tabelle als "Entitätsschlüssel" festgelegt. Suchen Sie beim Anzeigen der Datei model.edmx die entsprechende Tabelle und klicken Sie mit der rechten Maustaste auf die verschiedenen Eigenschaften, um sicherzustellen, dass nur für den Primärschlüssel "Entitätsschlüssel" ausgewählt ist. Das hat mein Problem gelöst.

3
DSF

Ich habe alle Tabellen aus dem edmx gelöscht und dann "Modell aus Datenbank aktualisieren". Vergewissern Sie sich auch, dass Sie Eigentümer der Datenbank sind.

2
danicode

Überprüfen Sie den Primärschlüssel für die Tabelle, falls vorhanden. 1) Öffnen Sie die EDMX-Datei, wählen Sie alle Tabellen aus und klicken Sie auf Aus Modell löschen. 2) Aktualisieren Sie das Modell von der Datenbank und fügen Sie alle erforderlichen Tabellen erneut hinzu

2
Madhava Reddy