Das EntitySet konnte nicht aktualisiert werden, da es ein DefiningQuery-Element und kein -Element gibt

Ich verwende Entity Framework 1 mit .net 3.5.

Ich mache etwas einfaches wie folgt:

var RoomDetails = context.Rooms.ToList(); foreach (var Room in Rooms) { Room.LastUpdated = DateTime.Now; } 

Ich bekomme diesen Fehler, wenn ich versuche:

  context.SaveChanges(); 

Ich bekomme den Fehler:

Das EntitySet konnte nicht aktualisiert werden, da es über ein DefiningQuery-Element verfügt und im Element kein Element vorhanden ist, um die aktuelle Operation zu unterstützen.

Ich mache viele Updates über den Kontext und habe keine Probleme, es ist nur, wenn ich versuche, diese bestimmte Entität zu aktualisieren.

All meine Suche zeigt die gleiche Sache, dass es keinen Primärschlüssel für die Entität gibt, die ich zu aktualisieren versuche. Aber leider habe ich einen Primärschlüssel erklärt …

Solutions Collecting From Web of "Das EntitySet konnte nicht aktualisiert werden, da es ein DefiningQuery-Element und kein -Element gibt"

Dies geschieht normalerweise aus einem der folgenden Gründe:

  • Entitätsgruppe wird aus der databaseansicht zugeordnet
  • Eine benutzerdefinierte databaseabfrage
  • Die databasetabelle hat keinen Primärschlüssel

Nachdem Sie dies getan haben, müssen Sie möglicherweise noch im Entity Framework-Designer aktualisieren (oder alternativ die Entität löschen und dann hinzufügen), bevor Sie den Fehler nicht mehr erhalten.

Fügen Sie einfach einen Primärschlüssel zur Tabelle hinzu. Das ist es. Problem getriggers.

 ALTER TABLE  ADD CONSTRAINT  PRIMARY KEY() 

Dies ist der Fall für mich. Das einfache Entfernen führte zu einem anderen Fehler. Ich habe die Schritte dieses Posts mit Ausnahme der letzten verfolgt. Für Ihre Bequemlichkeit kopierte ich die 4 Schritte von dem Post, dem ich folgte, um das Problem wie folgt zu lösen:

  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 das store:Schema="dbo" zu Schema="dbo" (andernfalls erzeugt der Code einen Fehler, der sagt, dass der Name ungültig ist)

Beachten Sie, dass Ihre Entity möglicherweise einen Primärschlüssel hat , Ihre Tabelle in der database jedoch keinen Primärschlüssel hat .

UPDATE: Ich habe in letzter Zeit ein paar Upvotes bekommen, also dachte ich mir, ich würde die Leute wissen lassen, dass der Rat, den ich unten gebe, nicht der beste ist. Da ich anfing, Entity Framework auf alten schlüssellosen databaseen zu betreiben, bin ich zu der Erkenntnis gekommen, dass das Beste, was Sie mit FAR tun können, ist, Code rückwärts umzukehren. Es gibt ein paar gute Artikel darüber, wie man das macht. Folgen Sie ihnen einfach, und wenn Sie einen Schlüssel hinzufügen möchten, verwenden Sie Datenanmerkungen, um den Schlüssel zu fälschen.

Sagen wir zum Beispiel, ich kenne meine Tabelle Orders , obwohl sie keinen Primärschlüssel hat, ist sichergestellt, dass sie nur eine Bestellnummer pro Kunde hat. Da dies die ersten beiden Spalten auf dem Tisch sind, habe ich den Code so eingerichtet, dass die ersten classn so aussehen:

  [Key, Column(Order = 0)] public Int32? OrderNumber { get; set; } [Key, Column(Order = 1)] public String Customer { get; set; } 

Auf diese Weise glauben Sie, dass es einen geclusterten Schlüssel aus OrderNumber und Customer gibt. Dadurch können Sie Einfügungen, Aktualisierungen usw. auf Ihrer Keyless-Tabelle vornehmen.

Wenn Sie mit Code First nicht vertraut sind, suchen Sie zunächst nach einem guten Tutorial zum Entity Framework Code. Dann gehen Sie zu einem Reverse Code First (der Code First mit einer vorhandenen database macht). Dann komm einfach zurück und sieh dir meinen Schlüsselratschlag noch einmal an. 🙂

Ursprüngliche Antwort :

Erstens: Wie andere gesagt haben, ist die beste Option, einen Primärschlüssel zur Tabelle hinzuzufügen. Punkt. Wenn Sie dies tun können, lesen Sie nicht weiter.

Aber wenn Sie nicht können oder nur sich selbst hassen, gibt es einen Weg, es ohne den Primärschlüssel zu tun.

In meinem Fall arbeitete ich mit einem Legacy-System (ursprünglich flache Dateien auf einem AS400, portiert nach Access und dann portiert nach T-SQL). Also musste ich einen Weg finden. Das ist meine Lösung. Das Folgende funktionierte für mich mit Entity Framework 6.0 (das neueste zu NuGet).

  1. Klicken Sie mit der rechten Maustaste auf Ihre EDMX-Datei im Projektmappen-Explorer. Wählen Sie “Öffnen mit …” und dann “XML (Text) Editor”. Wir werden den automatisch generierten Code hier manuell bearbeiten.

  2. Suchen Sie nach einer Zeile wie dieser:

  3. store:Name="table_name" entfernen store:Name="table_name" vom Ende.

  4. store:Schema="whatever" ändern store:Schema="whatever" zu Schema="whatever"

  5. Suchen Sie unter dieser Zeile nach dem Tag . Es wird eine große ol ‘Select-Aussage enthalten. Entfernen Sie das Tag und seinen Inhalt.

  6. Jetzt sollte Ihre Zeile in etwa so aussehen:

  7. Wir müssen etwas anderes ändern. Gehe durch deine Datei und finde folgendes:

  8. In der Nähe werden Sie wahrscheinlich einen kommentierten Text sehen, der Sie warnt, dass kein Primärschlüssel identifiziert wurde, daher wurde der Schlüssel abgeleitet und die Definition ist eine schreibgeschützte Tabelle / Ansicht. Sie können es verlassen oder löschen. Ich habe es gelöscht.

  9. Unten ist das -Tag. Dies wird von Entity Framework zum Einfügen / Aktualisieren / Löschen verwendet. So stellen Sie sicher, dass Sie dieses Recht tun. Die Eigenschaft (oder Eigenschaften) in diesem Tag müssen eine eindeutig identifizierbare Zeile angeben. Sagen wir zum Beispiel, dass ich meine Tischbestellungen kenne, obwohl es keinen Primärschlüssel hat, ist sichergestellt, dass nur eine Bestellnummer pro Kunde existiert.

Also meins sieht aus wie:

      

Ernsthaft, tu das nicht falsch. Nehmen wir an, dass, obwohl es niemals Duplikate geben sollte, irgendwie zwei Zeilen mit derselben Bestellnummer und demselben Kundennamen in mein System gelangen. Whoops! Das bekomme ich, wenn ich keinen Schlüssel benutze! Also benutze ich Entity Framework, um eins zu löschen. Weil ich weiß, dass das Duplikat die einzige Bestellung ist, die heute aufgegeben wird, tue ich Folgendes:

 var duplicateOrder = myModel.orders.First(x => x.order_date == DateTime.Today); myModel.orders.Remove(duplicateOrder); 

Erraten Sie, was? Ich habe nur das Duplikat UND das Original gelöscht! Das liegt daran, dass ich Entity Framework gesagt habe, dass order_number / cutomer_name mein Primärschlüssel ist. Also, als ich es sagte, duplicateOrder zu entfernen, was es im Hintergrund tat war etwas wie:

 DELETE FROM orders WHERE order_number = (duplicateOrder's order number) AND customer_name = (duplicateOrder's customer name) 

Und mit dieser Warnung … solltest du jetzt gut gehen!

Dies kann auch passieren, wenn das Datenmodell veraltet ist.

Hoffentlich wird das jemand Frustration retten 🙂

Ich bekam die gleiche Fehlermeldung, aber in meinem Szenario habe ich versucht, Entitäten, die aus einer Viele-zu-Viele-Beziehung abgeleitet wurden, mit einem PJT (Pure Join Table) zu aktualisieren.

Beim Lesen der anderen Posts dachte ich, ich könnte es beheben, indem ich ein zusätzliches PK-Feld zur Join-Tabelle hinzufüge … Wenn Sie jedoch eine PK-Spalte zu einer Join-Tabelle hinzufügen, ist es kein PJT mehr und Sie verlieren alle Entity Framework Vorteile wie die automatische Beziehungszuordnung zwischen den Entitäten.

Die Lösung in meinem Fall bestand also darin, die Join-Tabelle in der database zu ändern, um eine PK zu erstellen, die BEIDE Spalten mit den fremden IDs enthält.

Ein Fehler kann auftreten, wenn Ihre Tabelle keinen Primärschlüssel hat. In diesem Fall ist die Tabelle schreibgeschützt und der Befehl db.SaveChanges () führt immer zu einem Fehler

so ist es wahr, fügen Sie einfach einen Primärschlüssel hinzu

Hinweis: Achten Sie darauf, dass bei der Aktualisierung Ihres EF-Diagramms aus der database, die Sie auf die richtige database verweisen, in meinem Fall die Verbindungszeichenfolge auf eine lokale DB anstatt auf die aktuelle Dev-DB, Schüler, verweist Fehler Ich weiß, aber ich wollte dies posten, weil es sehr frustrierend sein kann, wenn Sie überzeugt sind, dass Sie den Primärschlüssel hinzugefügt haben und Sie immer noch den gleichen Fehler erhalten

Ich hatte das gleiche Problem. Wie dieser Thread sagte, hatte meine Tabelle keinen PK, also habe ich den PK gesetzt und den Code ausgeführt. Aber leider kam der Fehler wieder. Was ich als nächstes getan habe, war, löschte die DB-Verbindung (lösche EDMX-Datei im Model-Ordner des Projektmappen-Explorers) und erstellte sie neu. Fehler ist danach gegangen. Danke an alle, die deine Erfahrungen geteilt haben. Es spart viel Zeit.

Ich bekam dieses Problem, weil ich mein EDMX aus einer bestehenden database (die von jemand anderem entwickelt wurde, und ich benutze hier den Begriff ‘designed’) generierte.

Es stellte sich heraus, dass der Tisch überhaupt keine Schlüssel hatte. EF hat das Modell mit vielen Mehrfachschlüsseln erzeugt. Ich musste einen Primärschlüssel zur db-Tabelle in SQL hinzufügen und dann mein Modell in VS aktualisieren.

Das hat es für mich behoben.

Setzen Sie den Primärschlüssel und speichern Sie Tabelle und Aktualisieren. Gehen Sie dann zu Model.edmx delete table und rufen Sie erneut auf.

Das Hinzufügen des Primärschlüssels funktionierte auch für mich!

Danach können Sie das Datenmodell aktualisieren, ohne es zu löschen.

Klicken Sie mit der rechten Maustaste auf die edmx Entity Designer-Seite und aktualisieren Sie das Modell von der database.

Ich hatte genau das gleiche Problem, das Hinzufügen des Primärschlüssels triggers das Problem leider nicht. Also hier ist, wie ich meins löse:

  1. Stellen Sie sicher, dass Sie einen primary key für die Tabelle haben, damit ich meine Tabelle ändern und einen Primärschlüssel hinzufügen kann.
  2. Delete the ADO.NET Entity Data Model (edmx-Datei), das ich für die Zuordnung und Verbindung mit meiner database verwende.
  3. Add again a new file of ADO.NET Entity Data Model , um eine Verbindung mit meiner database herzustellen und meine Modelleigenschaften zuzuordnen.
  4. Clean and rebuild the solution.

Problem getriggers.

Fügen Sie einfach einen Primärschlüssel zu Ihrer Tabelle hinzu und erstellen Sie dann Ihre EF neu

Ich musste nur den Tisch aus dem Modell entfernen und das Modell erneut aktualisieren, um den Tisch zurück zu bringen. Ich vermute, dass der Primärschlüssel erstellt wurde, nachdem die Tabelle in das Modell gezogen wurde.

Ich hatte dieses Problem heraufgekommen und glaube, dass es verursacht wurde, weil ich den Index auf meinem Primärschlüssel der Tabellen gelöscht und ihn durch einen Index auf einigen der anderen Felder in der Tabelle ersetzt hatte.

Nachdem ich den Primärschlüssel-Index gelöscht und den Edmx aktualisiert hatte, funktionierten die Einfügungen nicht mehr.

Ich habe die Tabelle auf die ältere Version aktualisiert, die edmx aktualisiert und alles funktioniert wieder.

Ich sollte beachten, dass, als ich den EDMX öffnete, um dieses Problem zu beheben, die Überprüfung, um festzustellen, ob ein Primärschlüssel definiert wurde, gab. Also half keiner der obigen Vorschläge mir. Aber das Aktualisieren des Index auf dem Primärschlüssel schien zu funktionieren.

Öffnen Sie Ihre EDMX-Datei im XML-Editor und entfernen Sie dann Tag aus Tag und ändern Sie auch store: Schema = “dbo” zu Schema = “dbo” und Wiederaufbau der Lösung jetzt Fehler wird getriggers und Sie können die Daten speichern.