Es hat eine DefiningQuery, aber kein InsertFunction-Element… err

123

Dieses Ding macht mich verrückt und der Fehler ist für mich ziemlich bedeutungslos:

Das EntitySet 'TableB' kann nicht aktualisiert werden, da es eine DefiningQuery enthält und kein Element im Element vorhanden ist, das den aktuellen Vorgang unterstützt.

Meine Tische sind so aufgestellt:

Tabelle A.
int idA (Identität, Primärschlüssel)
...

Tabelle B.
int idA (FK für TableA.idA)
int val

Tabelle B hat keinen definierten Primärschlüssel im SQL Server. Das Entity Framework hat die Tabelle und die Zuordnung importiert und beide Felder als Schlüssel festgelegt. Aber es wird diesen Fehler ausgeben, wenn ich versuche, eine Einfügung in die Tabelle vorzunehmen!

Was ist los mit dir??


Bearbeiten: Wie von Alex vorgeschlagen, war die Lösung folgende:

  1. Klicken Sie mit der rechten Maustaste auf die edmx-Datei und wählen Sie Öffnen mit, XML-Editor
  2. Suchen Sie die Entität im Element edmx: StorageModels
  3. Entfernen Sie die DefiningQuery vollständig
  4. Benennen Sie den Speicher um: Schema = "dbo" in Schema = "dbo" (andernfalls generiert der Code einen Fehler, der besagt, dass der Name ungültig ist)
  5. Entfernen Sie die Eigenschaft store: Name

Ich habe den Schlüssel so belassen, wie er war, da es für mich in Ordnung war, dass beide Spalten Teil des Schlüssels sind.

Palantir
quelle
6
Vielen Dank für das Update - die Schritt-für-Schritt-Anleitung hat diesem EF-Neuling geholfen, die ASP.NET MVC-Tutorial-App zum Laufen zu bringen!
Adam Neal
Danke dafür! Ich hatte ein Problem, dass EF keine richtige EDMX-Datei für die SQL Server 2000-Tabelle generiert hat, die über einen Primärschlüssel verfügt. Aber diese Anweisung hat mich gerettet :)
100r
4
3,5 Jahre später, und dieser Beitrag hilft immer noch ppl, in diesem Fall ME! ... An: Palantir für die Beschreibung Schritt für Schritt (es hat funktioniert) und danke an Alex >>> Bravo!
Nanonerd
Die Lösung hat bei mir funktioniert. Danke
Delavega
Das Geheimnis war das Entfernen von "store:" aus der Schemadefinition. Sehr schön
Guilherme Ferreira

Antworten:

141

Wenn eine Tabelle ohne PrimaryKey gefunden wird, wird sie als Ansicht behandelt.

Und Ansichten werden in der EDMX-Datei (in einem XML-Editor geöffnet) im Element StorageModel \ EntitySet [n] \ DefiningQuery angezeigt.

Wenn Sie eine DefiningQuery haben, wird die Entität schreibgeschützt, es sei denn, Sie fügen Änderungsfunktionen hinzu. Sie benötigen 3 Änderungsfunktionen (auch als gespeicherte Prozeduren bezeichnet), jeweils eine für Einfügen, Aktualisieren und Löschen.

Sie haben jedoch zwei Möglichkeiten:

Ändern Sie die Schlüsseldefinition:

  1. Und überzeugen Sie die EF davon, dass das, was sie für eine Ansicht hält, wirklich ein Tisch ist
  2. Oder fügen Sie die entsprechenden Änderungsfunktionen hinzu

In Ihrem Fall empfehle ich (1).

Alex James
quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, einer Junction-Tabelle eine Entität hinzuzufügen. Ihr Vorschlag hat es behoben, danke!
Walter Stabosz
es ist ausgezeichnet ..., Tnks
Mohan Gundlapalli
Vergessen Sie nicht, in Ihrer .edmx-Datei, die Sie zuerst aus der Datenbank generiert haben, auf "Modell aus Datenbank aktualisieren" zu klicken
Bashar Abu Shamaa,
Ich stehe vor dem gleichen Problem, seltsamer Teil ist, es funktioniert gut in unserer lokalen und Testumgebung, es funktioniert einfach nicht in der Kundenumgebung (langweilig)
Mox Shah
13

Fügen Sie der Tabelle einfach einen Primärschlüssel hinzu. Das ist es. Problem gelöst.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)
Jebastin J.
quelle
6

Ich habe einen Primärschlüssel in meiner Tabelle vermisst und diese Fehlermeldung erhalten. Nachdem ich den Schlüssel zur Tabelle hinzugefügt hatte, musste ich die Tabelle mit dem Designer aus dem edmx löschen, den edmx speichern und dann erneut aktualisieren, um die Tabelle wieder hinzuzufügen. Der Schlüssel wurde nicht abgeholt da es schon als view vergeben wurde. Dies erforderte keine manuelle Bearbeitung des edmx.

mlapaglia
quelle
5

Fügen Sie der Tabelle einen Primärschlüssel hinzu, löschen Sie das Modell aus dem edmx-Modell, wählen Sie dann Update aus Datenbank auswählen, erstellen und ausführen ...... funktioniert


quelle
1

@ Palantir. Stellen Sie sicher, dass für beide Tabellen Primärschlüssel festgelegt sind, und achten Sie darauf, dass mehrere Primärschlüssel in einer Tabelle festgelegt sind.

Paulo 'PaulusHC' Gomes
quelle
0
  1. Sie müssen die EDMX-Datei manuell in Notepad oder Notepad ++ oder in einem Texteditor Ihrer Wahl öffnen.
  2. Suchen Sie den Eintrag in edmx: StorageModels in der in Schritt 1 geöffneten Datei.
  3. Suchen Sie das DefiningQuery-Element und entfernen Sie dieses Tag vollständig.
  4. Suchen Sie den Speicher: Schema = "dbo" bis Schema = "dbo" (wenn Sie diesen Schritt überspringen, wird ein Fehler generiert, dessen Name ungültig ist).
  5. Speichern und schließen Sie die Datei.

Hoffe, es wird das Problem lösen.

Brijesh Kumar Tripathi
quelle