Ich verwende Entity Framework 1 mit .net 3.5.
Ich mache so etwas Einfaches:
var roomDetails = context.Rooms.ToList();
foreach (var room in roomDetails)
{
room.LastUpdated = DateTime.Now;
}
Ich erhalte diesen Fehler, wenn ich Folgendes versuche:
context.SaveChanges();
Ich bekomme den Fehler:
Das EntitySet kann nicht aktualisiert werden, da es eine DefiningQuery enthält und im Element <ModificationFunctionMapping> kein <UpdateFunction> -Element vorhanden ist, um den aktuellen Vorgang zu unterstützen.
Ich mache viele Aktualisierungen im Kontext und habe keine Probleme. Es ist nur, wenn ich versuche, diese bestimmte Entität zu aktualisieren.
Alle meine Suchvorgänge zeigen dasselbe, dass für die Entität, die ich aktualisieren möchte, kein Primärschlüssel deklariert ist. Aber leider habe ich einen Primärschlüssel deklariert ...
Antworten:
Dies geschieht normalerweise aus einem der folgenden Gründe:
Danach müssen Sie möglicherweise noch im Entity Framework-Designer aktualisieren (oder alternativ die Entität löschen und dann hinzufügen), bevor der Fehler nicht mehr angezeigt wird.
quelle
Fügen Sie der Tabelle einfach einen Primärschlüssel hinzu. Das ist es. Problem gelöst.
quelle
Dies ist bei mir der Fall. Das einfache Entfernen führte zu einem weiteren Fehler. Ich habe die Schritte dieses Beitrags bis auf den letzten befolgt. Zur Vereinfachung habe ich die 4 Schritte aus dem Beitrag, den ich zur Lösung des Problems befolgt habe, wie folgt kopiert:
store:Schema="dbo"
in umSchema="dbo"
(andernfalls generiert der Code einen Fehler, der besagt, dass der Name ungültig ist).quelle
Beachten Sie nur, dass Ihre Entität möglicherweise einen Primärschlüssel hat , Ihre Tabelle in der Datenbank jedoch keinen Primärschlüssel .
quelle
UPDATE: Ich habe in letzter Zeit ein paar positive Stimmen dazu bekommen, also dachte ich mir, ich würde die Leute wissen lassen, dass der Rat, den ich unten gebe, nicht der beste ist. Seit ich anfänglich damit angefangen habe, Entity Framework für alte schlüssellose Datenbanken zu verwenden, habe ich festgestellt, dass das Beste, was Sie bei weitem tun können, darin besteht, es zuerst mit dem umgekehrten Code zuerst auszuführen. Es gibt ein paar gute Artikel darüber, wie das geht. Folgen Sie ihnen einfach, und wenn Sie einen Schlüssel hinzufügen möchten, verwenden Sie Datenanmerkungen, um den Schlüssel zu "fälschen".
Nehmen wir zum Beispiel an, ich weiß, dass meine Tabelle
Orders
, obwohl sie keinen Primärschlüssel hat, immer nur eine Bestellnummer pro Kunde hat. Da dies die ersten beiden Spalten in der Tabelle sind, habe ich die Code-First-Klassen so eingerichtet, dass sie folgendermaßen aussehen:Auf diese Weise täuschen Sie EF im Grunde vor, dass es einen Clustered Key gibt, der aus OrderNumber und Customer besteht. Auf diese Weise können Sie Einfügungen, Aktualisierungen usw. für Ihren schlüssellosen Tisch vornehmen.
Wenn Sie mit Reverse Code First nicht allzu vertraut sind, finden Sie ein gutes Tutorial zu Entity Framework Code First. Suchen Sie dann einen unter Reverse Code First (der Code First mit einer vorhandenen Datenbank ausführt). Dann komm einfach zurück und schau dir noch einmal meine wichtigsten Ratschläge an. :) :)
Ursprüngliche Antwort :
Erstens: Wie andere bereits gesagt haben, besteht die beste Option darin, der Tabelle einen Primärschlüssel hinzuzufügen. Punkt. Wenn Sie dies tun können, lesen Sie nicht weiter.
Aber wenn Sie nicht können oder sich einfach nur hassen, gibt es eine Möglichkeit, dies ohne den Primärschlüssel zu tun.
In meinem Fall arbeitete ich mit einem Legacy-System (ursprünglich flache Dateien auf einem AS400, der auf Access portiert und dann auf T-SQL portiert wurde). Also musste ich einen Weg finden. Das ist meine Lösung. Das Folgende funktionierte für mich mit Entity Framework 6.0 (das neueste auf NuGet zum Zeitpunkt dieses Schreibens).
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihre EDMX-Datei. Wählen Sie "Öffnen mit ..." und dann "XML (Text) Editor". Wir werden den automatisch generierten Code hier von Hand bearbeiten.
Suchen Sie nach einer Zeile wie dieser:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">
store:Name="table_name"
Vom Ende entfernen .Wechseln Sie
store:Schema="whatever"
zuSchema="whatever"
Schauen Sie unter diese Zeile und finden Sie das
<DefiningQuery>
Tag. Es wird eine große alte select-Anweisung enthalten. Entfernen Sie das Tag und seinen Inhalt.Jetzt sollte Ihre Linie ungefähr so aussehen:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />
Wir müssen noch etwas ändern. Gehen Sie Ihre Datei durch und finden Sie Folgendes:
<EntityType Name="table_name">
In der Nähe wird wahrscheinlich ein kommentierter Text angezeigt, der Sie darauf hinweist, 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.
Unten ist das
<Key>
Tag. Dies wird Entity Framework zum Einfügen / Aktualisieren / Löschen verwenden. Stellen Sie also sicher, dass Sie dies richtig machen. Die Eigenschaft (oder Eigenschaften) in diesem Tag müssen eine eindeutig identifizierbare Zeile angeben. Nehmen wir zum Beispiel an, ich weiß, dass meine Tabelleorders
, obwohl sie keinen Primärschlüssel hat, immer nur eine Bestellnummer pro Kunde hat.Meins sieht also so aus:
Im Ernst, mach das nicht falsch. Nehmen wir an, obwohl es niemals Duplikate geben sollte, gelangen irgendwie zwei Zeilen mit derselben Bestellnummer und demselben Kundennamen in mein System. Whooops! Das bekomme ich, wenn ich keinen Schlüssel benutze! Also benutze ich Entity Framework, um eines zu löschen. Da ich weiß, dass das Duplikat die einzige Bestellung ist, die heute aufgegeben wird, mache ich Folgendes:
Erraten Sie, was? Ich habe gerade sowohl das Duplikat als auch das Original gelöscht! Das liegt daran, dass ich Entity Framework mitgeteilt habe, dass order_number / cutomer_name mein Primärschlüssel ist. Als ich ihm sagte, er solle duplicateOrder entfernen, war das im Hintergrund ungefähr so:
Und mit dieser Warnung ... sollten Sie jetzt bereit sein zu gehen!
quelle
Dies kann auch passieren, wenn das Datenmodell veraltet ist.
Hoffentlich erspart dies jemand anderem Frustration :)
quelle
Ich habe die gleiche Fehlermeldung erhalten, aber in meinem Szenario habe ich versucht, Entitäten, die aus einer Viele-zu-Viele-Beziehung abgeleitet wurden, mithilfe eines PJT (Pure Join Table) zu aktualisieren.
Beim Lesen der anderen Beiträge dachte ich, ich könnte das Problem beheben, indem ich der Join-Tabelle ein zusätzliches PK-Feld hinzufüge. Wenn Sie jedoch einer Join-Tabelle eine PK-Spalte hinzufügen, handelt es sich nicht mehr um ein PJT, und Sie verlieren alle Vorteile des Entity Frameworks wie die automatische Zuordnung von Beziehungen zwischen den Entitäten.
In meinem Fall bestand die Lösung darin, die Join-Tabelle in der Datenbank so zu ändern, dass eine PK erstellt wird, die BEIDE der fremden ID-Spalten enthält.
quelle
Wenn Ihre Tabelle keinen Primärschlüssel hat, kann ein Fehler auftreten. In diesem Fall ist die Tabelle "schreibgeschützt", und der Befehl db.SaveChanges () führt immer zu einem Fehler
quelle
Setzen Sie den Primärschlüssel, speichern Sie die Tabelle und aktualisieren Sie sie. Gehen Sie dann zu Model.edmx, löschen Sie die Tabelle und rufen Sie sie erneut ab.
quelle
Fügen Sie einfach einen Primärschlüssel hinzu
Hinweis: Stellen Sie sicher, dass beim Aktualisieren Ihres EF-Diagramms aus der Datenbank, die Sie auf die richtige Datenbank verweisen , in meinem Fall die Verbindungszeichenfolge auf eine lokale Datenbank anstatt auf die aktuelle Dev DB, Schuljunge, verweist Fehler, den ich kenne, 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 immer noch den gleichen Fehler erhalten
quelle
Ich hatte das gleiche Problem. Wie dieser Thread sagte, hatte meine Tabelle keine PK, also habe ich die PK festgelegt und den Code ausgeführt. Aber leider kam wieder ein Fehler. Als Nächstes habe ich die DB-Verbindung gelöscht (.edmx-Datei im Modellordner des Projektmappen-Explorers löschen) und neu erstellt. Fehler danach verschwunden. Vielen Dank an alle, die Ihre Erfahrungen geteilt haben. Das spart viel Zeit.
quelle
Ich habe dieses Problem erhalten, weil ich mein EDMX aus einer vorhandenen Datenbank generiert habe (von jemand anderem entworfen, und ich verwende den Begriff "entworfen" hier lose).
Es stellte sich heraus, dass der Tisch überhaupt keine Schlüssel hatte. EF generierte das Modell mit vielen mehreren Schlüsseln. Ich musste der Datenbank-Tabelle in SQL einen Primärschlüssel hinzufügen und dann mein Modell in VS aktualisieren.
Das hat es für mich behoben.
quelle
Dies ist keine neue Antwort, hilft aber jemandem, der nicht sicher ist, wie er den Primärschlüssel für seine Tabelle festlegen soll. Verwenden Sie dies in einer neuen Abfrage und führen Sie es aus. Dadurch wird die UniqueID-Spalte als Primärschlüssel festgelegt.
quelle
In meinem Fall habe ich vergessen, den Primärschlüssel für die Tabelle zu definieren. Weisen Sie also wie in Bild gezeigt zu und aktualisieren Sie Ihre Tabelle aus "Modell aus Datenbank aktualisieren" aus der EDMX-Datei. Hoffe es wird helfen !!!
quelle
Das Hinzufügen des Primärschlüssels hat auch bei mir funktioniert!
Sobald dies erledigt ist, können Sie das Datenmodell wie folgt aktualisieren, ohne es zu löschen:
Klicken Sie mit der rechten Maustaste auf die edmx Entity Designer-Seite und klicken Sie auf "Modell aus Datenbank aktualisieren".
quelle
Ich hatte genau das gleiche Problem, leider löst das Hinzufügen des Primärschlüssels das Problem nicht. So löse ich meine:
primary key
auf dem Tisch haben, damit ich meine Tabelle ändere und einen Primärschlüssel hinzufüge.Delete the ADO.NET Entity Data Model
(edmx-Datei), in der ich meine Datenbank abbilde und mit ihr verbinde.Add again a new file of ADO.NET Entity Data Model
um eine Verbindung mit meiner Datenbank herzustellen und meine Modelleigenschaften zuzuordnen.Clean and rebuild the solution.
Problem gelöst.
quelle
Fügen Sie einfach einen Primärschlüssel zu Ihrer Tabelle hinzu und erstellen Sie dann Ihre EF neu
quelle
Ich musste nur die Tabelle aus dem Modell entfernen und das Modell erneut aktualisieren, um die Tabelle zurückzubringen. Ich denke, der Primärschlüssel wurde erstellt, nachdem die Tabelle in das Modell gezogen wurde.
quelle
Ich hatte dieses Problem und glaube, es wurde verursacht, weil ich den Index für den Primärschlüssel meiner Tabelle gelöscht und durch einen Index für einige der anderen Felder in der Tabelle ersetzt hatte.
Nachdem ich den Primärschlüsselindex gelöscht und den edmx aktualisiert hatte, funktionierten die Einfügungen nicht mehr.
Ich habe die Tabelle auf die ältere Version aktualisiert, den edmx aktualisiert und alles funktioniert wieder.
Ich sollte beachten, dass beim Öffnen des EDMX zur Behebung dieses Problems überprüft wurde, ob ein Primärschlüssel definiert war. Keiner der oben genannten Vorschläge hat mir also geholfen. Das Aktualisieren des Index für den Primärschlüssel schien jedoch zu funktionieren.
quelle
Öffnen Sie Ihre .edmx-Datei im XML-Editor, entfernen Sie das Tag aus dem Tag und ändern Sie den Speicher: Schema = "dbo" in Schema = "dbo". Erstellen Sie die Lösung jetzt neu. Der Fehler wird behoben und Sie können die Daten speichern.
quelle
Ich fand, dass die ursprüngliche Antwort auf das Aktualisieren der EDMX-Datei in meiner Situation am besten funktioniert. Ich war einfach nicht sehr glücklich darüber, das Modell jedes Mal zu ändern, wenn es aus der Datenbank aktualisiert wurde. Aus diesem Grund habe ich eine zusätzliche Textvorlagendatei geschrieben, die automatisch aufgerufen wird, wenn sich das Modell geändert hat - genau wie die Entitäten neu generiert wurden. Ich poste es hier in diesem Kommentar. Damit es funktioniert, stellen Sie sicher, dass Sie es wie {Modellname} .something.tt benennen und im selben Ordner wie Ihr .edmx-Ordner speichern. Ich habe es {Modellname} .NonPkTables.tt genannt. Aufgrund der ungültigen Dateierweiterungsdefinition in der zweiten Zeile wird keine eigene Datei generiert. Fühlen Sie sich frei zu benutzen.
quelle
Ich hatte die gleiche Fehlermeldung beim Einfügen eines Datensatzes in eine Tabelle mit einer Viele-zu-Viele- Beziehung. Mein Datenbankschema war:
Tabelle : Student und Course haben Primärschlüssel Id und - Code jeweils , während der Tisch Schüler-Kurs hat zwei Fremdschlüssel abgebildet mit Studenten und Kurstabellen.
Logischerweise ist das Schema korrekt, aber ich habe einen Fehler in der Datenbank gemacht, da jede Tabelle einen Primärschlüssel haben sollte.
Meine SQL-Definition für den Studentenkurs war:
Ich habe ein Paar Fremdschlüssel zum Primärschlüssel dieser Tabelle gemacht und aktualisiert auf:
Hoffe, es wird Probleme für einige Leute lösen.
quelle