webentwicklung-frage-antwort-db.com.de

Wie behebe ich den Fehler 3002?

Angenommen, ich habe die folgenden Tabellendefinitionen in SQL Server 2008:

CREATE TABLE Person
(PersonId INT IDENTITY NOT NULL PRIMARY KEY,
 Name VARCHAR(50) NOT NULL,
 ManyMoreIrrelevantColumns VARCHAR(MAX) NOT NULL)

CREATE TABLE Model
(ModelId INT IDENTITY NOT NULL PRIMARY KEY,
 ModelName VARCHAR(50) NOT NULL,
 Description VARCHAR(200) NULL)

CREATE TABLE ModelScore
(ModelId INT NOT NULL REFERENCES Model (ModelId),
 Score INT NOT NULL,
 Definition VARCHAR(100) NULL,
 PRIMARY KEY (ModelId, Score))

CREATE TABLE PersonModelScore
(PersonId INT NOT NULL REFERENCES Person (PersonId),
 ModelId INT NOT NULL,
 Score INT NOT NULL,
 PRIMARY KEY (PersonId, ModelId),
 FOREIGN KEY (ModelId, Score) REFERENCES ModelScore (ModelId, Score))

Die Idee dabei ist, dass jede Person nur einen ModelScore pro Model haben kann, aber jede Person kann eine Punktzahl für eine beliebige Anzahl definierter Models haben. Soweit ich das beurteilen kann, sollte diese SQL diese Einschränkungen auf natürliche Weise durchsetzen. Der ModelScore hat eine bestimmte "Bedeutung", die in der Definition enthalten ist. Nichts Erderschütterndes.

Jetzt versuche ich, dies mit dem Designer in Entity Framework zu übersetzen. Nachdem ich das Modell aus der Datenbank aktualisiert und einige Bearbeitungen vorgenommen habe, habe ich ein Person-Objekt, ein Model-Objekt und ein ModelScore-Objekt. PersonModelScore ist als Join-Tabelle kein Objekt, sondern wird als Verknüpfung mit einem anderen Namen eingefügt (sagen wir mal ModelScorePersonAssociation). Die Zuordnungsdetails für die Zuordnung lauten wie folgt:

Verband
 - Zuordnung zu PersonModelScore 
 - ModelScore 
 ModelId: Int32 <=> ModelId: int 
 Score: Int32 <=> Score: int 
 - Person 
 PersonId: Int32 <=> PersonId: int 

Auf der rechten Seite haben die Werte ModelId und PersonId Primärschlüsselsymbole, der Wert Score jedoch nicht.

Beim Kompilieren erhalte ich:

Error 3002: Problem in Mapping Fragment starting at line 5190: Potential runtime violation of table PersonModelScore's keys (PersonModelScore.ModelId, PersonModelScore.PersonId): Columns (PersonModelScore.PersonId, PersonModelScore.ModelId) are mapped to EntitySet ModelScorePersonAssociation's properties (ModelScorePersonAssociation.Person.PersonId, ModelScorePersonAssociation.ModelScore.ModelId) on the conceptual side but they do not form the EntitySet's key properties (ModelScorePersonAssociation.ModelScore.ModelId, ModelScorePersonAssociation.ModelScore.Score, ModelScorePersonAssociation.Person.PersonId).

Was habe ich im Designer oder auf andere Weise falsch gemacht und wie kann ich den Fehler beheben?

Danke vielmals!

40
Andrew

Zu Ihrer Frage hatte ich sehr spät das gleiche Problem und entdeckte, dass der Entity Framework-Designer meine "ScoreId" -Spalte (relativ zu Ihrer PersonModelScore-Tabelle) als Primärschlüsselspalte identifiziert hatte. Ich habe meine Einstellung für meine ScoreId in "false" geändert, und alles funktionierte danach gut. 

65
Shan Plourde

Sie können einen einzelnen Primärschlüssel in der Entität festlegen, um diesen Fehler zu vermeiden. Klicken Sie mit der rechten Maustaste auf die Skalareigenschaften des Felds in der Entität, und deaktivieren Sie den Entitätsschlüssel, wenn viele Primärschlüssel vorhanden sind.

12
Dhandapani

Sie sollten für jede Tabelle einen einzelnen Identitätsschlüssel erstellen.

ModelScore sollte eine ModelScoreId haben, PersonModelScore sollte eine PersonModelScoreId haben.

Verweise zwischen den Tabellen sollten ein einzelnes Feld sein.

2
Shiraz Bhaiji

Ihre PersonModelScore-Tabelle sollte eine Id-Spalte definieren, die Identität und Primärschlüssel ist. Anschließend Sollten Sie einen eindeutigen Schlüssel für PersonId, ModelId erstellen

in Bezug auf Fehler 3002 hatte ich das gleiche ProblemALLMein Feld wurde von EF als Entity-Schlüssel markiert

0
freddoo

"Gehen Sie zu Ihrer .edmx-Datei, klicken Sie mit der rechten Maustaste auf den Hintergrund und wählen Sie" Zuordnungsdetails ". Klicken Sie auf die Tabelle, die Sie zum Bearbeiten der Zuordnungen in Ihrem .edmx-Fenster benötigen. Die Details sollten in Ihrem neuen Fenster" Zuordnungsdetails "angezeigt werden. Öffnen Sie die Registerkarte "Eigenschaften" (drücken Sie F4, um die "Eigenschaften" anzuzeigen, wenn sie nicht geöffnet ist.) Klicken Sie in den "Zuordnungsdetails" auf "Wert/Eigenschaft", um die angezeigten Eigenschaften zu ändern. Im Eigenschaftenfenster können Sie nun den "Entitätsschlüssel" festlegen "Wert für" False ". - Chris Paton 4. Oktober 14 um 18:54"

Das hat für mich funktioniert - Danke Dies ist jetzt Teil meines Workflows, wenn Sie EF Database First verwenden. Und wir haben die Aufgabe, das Datenmodell zu aktualisieren.

0