Ich versuche, den Datensatz mit EF6 zu aktualisieren. Suchen Sie zuerst den Datensatz, falls vorhanden, und aktualisieren Sie ihn. Hier ist mein Code: -
var book = new Model.Book
{
BookNumber = _book.BookNumber,
BookName = _book.BookName,
BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
try
{
db.Books.Attach(book);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
Jedes Mal, wenn ich versuche, den Datensatz mit dem obigen Code zu aktualisieren, wird folgende Fehlermeldung angezeigt: -
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Die Anweisung zum Speichern, Einfügen oder Löschen des Speichers hat eine unerwartete Anzahl von Zeilen (0) beeinflusst. Entitäten wurden möglicherweise geändert oder gelöscht, seit Entitäten geladen wurden. Aktualisieren Sie den ObjectStateManager-Eintrag
c#
entity-framework
entity-framework-6
ef-database-first
user1327064
quelle
quelle
catch (Exception ex){throw;}
ist redundant und Sie können es vollständig entfernen.Antworten:
Sie versuchen, den Datensatz zu aktualisieren (was für mich bedeutet, "einen Wert für einen vorhandenen Datensatz zu ändern und ihn wieder zu speichern"). Sie müssen also das Objekt abrufen, eine Änderung vornehmen und es speichern.
quelle
db.SaveChanges()
mit geänderten Objekten im Kontext wird die Datenbank aktualisiert.SaveChanges
den Kontext aufrufen, werden alle Objekte ausgewertet, die verfolgt werden, um festzustellen, ob sie hinzugefügt, geändert oder gelöscht wurden, und die entsprechende SQL an die verbundene Datenbank ausgegeben.Ich habe den Quellcode von Entity Framework überprüft und eine Möglichkeit gefunden, eine Entität tatsächlich zu aktualisieren, wenn Sie die Key-Eigenschaft kennen:
Überprüfen Sie andernfalls die AddOrUpdate- Implementierung auf Ideen.
Ich hoffe das hilft!
quelle
SaveChanges()
, dass nach dem Einstellen der Werte ein Anruf erforderlich ist.Sie können die
AddOrUpdate
Methode verwenden:quelle
.AddOrUpdate()
Wird während der Datenbankmigration verwendet, wird dringend davon abgeraten, diese Methode außerhalb von Migrationen zu verwenden, weshalb sie sich imEntity.Migrations
Namespace befindet.AddOrUpdate()
ist die Methode für Migrationen gedacht und nicht für Situationen geeignet, in denen Sie nur vorhandene Zeilen aktualisieren müssen. Wenn Sie kein Buch mit Suchreferenz (dh ID) haben, wird eine neue Zeile erstellt, und dies kann in einigen Fällen ein Problem sein (z. B. haben Sie eine API, die Ihnen die Antwort 404-NotFound zurückgeben muss, wenn Sie dies tun Versuchen Sie, die PUT-Methode für nicht vorhandene Zeilen aufzurufen.Sie haben also eine Entität, die aktualisiert wird, und Sie möchten sie in der Datenbank mit der geringsten Menge an Code aktualisieren ...
Parallelität ist immer schwierig, aber ich gehe davon aus, dass Sie nur möchten, dass Ihre Updates gewinnen. Hier ist, wie ich es für denselben Fall gemacht und die Namen geändert habe, um Ihre Klassen nachzuahmen. Mit anderen Worten, wechseln Sie einfach
attach
zuadd
und es funktioniert für mich:quelle
Sie sollten die Entry () -Methode verwenden, wenn Sie alle Felder in Ihrem Objekt aktualisieren möchten. Denken Sie auch daran, dass Sie die Feld-ID (Schlüssel) nicht ändern können. Stellen Sie daher zuerst die ID so ein, wie Sie sie bearbeiten.
quelle
Dieser Code ist das Ergebnis eines Tests, bei dem nur eine Reihe von Spalten aktualisiert wurde, ohne dass eine Abfrage durchgeführt wurde, um den Datensatz zuerst zurückzugeben. Es wird zuerst Entity Framework 7-Code verwendet.
Hier ist der vollständige Code:
quelle
Für .net Kern
quelle
Hier ist die beste Lösung für dieses Problem: Fügen Sie in der Ansicht alle IDs (Schlüssel) hinzu. Erwägen Sie, mehrere Tabellen zu benennen (Erste, Zweite und Dritte).
Im C # -Code
quelle
Attach
Wenn eine Entität ihren Verfolgungsstatus auf setztUnchanged
. Um eine vorhandene Entität zu aktualisieren, müssen Sie lediglich den Verfolgungsstatus auf setzenModified
. Laut den EF6-Dokumenten :quelle
quelle
Ich habe einen Weg gefunden, der gut funktioniert.
quelle
Sie sollten entfernen
db.Books.Attach(book);
quelle
Hier ist meine Methode zur Aktualisierung der Entität nach RIA (für den Ef6-Zeitrahmen):
Beachten Sie, dass dies
FrameworkTypeUtility.SetProperties()
eine winzige Dienstprogrammfunktion ist, die ich lange vor AutoMapper auf NuGet geschrieben habe:quelle
Wie Renat sagte, entfernen Sie:
db.Books.Attach(book);
Ändern Sie außerdem Ihre Ergebnisabfrage in "AsNoTracking", da diese Abfrage den Modellstatus des Entity Frameworks beeinträchtigt. Es denkt, "Ergebnis" ist das Buch, das jetzt verfolgt werden muss, und das wollen Sie nicht.
quelle
Versuch es....
UpdateModel (Buch);
quelle
Ich weiß, dass es schon einige Male gut beantwortet wurde, aber ich mag es unten, dies zu tun. Ich hoffe es wird jemandem helfen.
quelle
Dies gilt für Entity Framework 6.2.0.
Wenn Sie ein bestimmtes
DbSet
Element haben, das entweder aktualisiert oder erstellt werden muss:Dies kann jedoch auch für ein Generikum
DbSet
mit einem einzelnen Primärschlüssel oder einem zusammengesetzten Primärschlüssel verwendet werden.quelle