Beste Weg, um Updates nur die geänderten Felder mit Entity Framework
Momentan mache ich so:
Beispiel:
public update(Person model)
{
//Here model is model return from form on post
var oldobj = db.Person.where(x=>x.ID = model.ID).SingleOrDefault();
db.Entry(oldobj).CurrentValues.SetValues(model);
}
Es funktioniert, aber zum Beispiel,
Ich habe 50 Spalten in meiner Tabelle, aber ich zeigte nur 25 Felder in meinem Formular (ich muss teilweise update meiner Tabelle mit den restlichen 25 Spalte beibehalten gleichen Alter Wert)
Ich weiß, es kann erreicht werden durch "mapping Spalten eins nach dem anderen" oder durch "versteckte Felder für die restlichen 25 Spalten".
Nur Fragen, gibt es irgendeinen eleganten Weg, dies zu tun mit weniger Aufwand und optimale Leistung?
Create View-Modell.. nur fügen Sie die Felder, die Sie wollen.. Werte Setzen
Auch ich create View-Modell; das gleiche problem immer noch vorhanden ist, während der Aktualisierung zu meiner Tabelle "Person". Bitte korrigieren Sie mich, wenn mir etwas fehlt
hat Ihr viewmodel haben nur die 25 Felder, die Sie anzeigen?
Derzeit habe ich insgesamt Person Viewmodel und ich bin das mapping mit Omu.ValueInjector mit-mapper.map-Klasse. Wenn ich ein viewmodel mit 25 Spalte, wie soll ich die Karte mit dem db-Modell und andere 25 Spalte behält die gleichen alten Wert aktualisieren??
Sie haben den ursprünglichen Wert aus der DB. nur setzen unterschiedliche Werte, und natürlich auch nur Diese aktualisiert wird (Identität tracking erfolgt mit PK und Parallelität Token in EF)
Auch ich create View-Modell; das gleiche problem immer noch vorhanden ist, während der Aktualisierung zu meiner Tabelle "Person". Bitte korrigieren Sie mich, wenn mir etwas fehlt
hat Ihr viewmodel haben nur die 25 Felder, die Sie anzeigen?
Derzeit habe ich insgesamt Person Viewmodel und ich bin das mapping mit Omu.ValueInjector mit-mapper.map-Klasse. Wenn ich ein viewmodel mit 25 Spalte, wie soll ich die Karte mit dem db-Modell und andere 25 Spalte behält die gleichen alten Wert aktualisieren??
Sie haben den ursprünglichen Wert aus der DB. nur setzen unterschiedliche Werte, und natürlich auch nur Diese aktualisiert wird (Identität tracking erfolgt mit PK und Parallelität Token in EF)
InformationsquelleAutor 10K35H 5H4KY4 | 2015-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine sehr gute Frage. Standardmäßig habe ich festgestellt, dass so lange, wie die änderungsnachverfolgung aktiviert ist (es ist standardmäßig aktiviert, es sei denn, Sie schalten Sie ihn aus), Entity Framework, machen einen guten job von der Anwendung nur in der Datenbank, was Sie Fragen, es zu ändern.
Also, wenn Sie ändern nur 1 Feld gegen das Objekt und rufen Sie dann SaveChanges(), EF wird nur aktualisiert, 1-Feld, wenn Sie anrufen SaveChanges().
Hier das problem, dass beim anzeigen einer view-Modell in ein entity-Objekt, werden alle Werte überschrieben bekommen. Hier ist meine Art des Umgangs mit diesen:
In diesem Beispiel haben Sie eine einzige Entität namens Person:
Nun sagen wir, wir möchten, erstellen Sie ein view-Modell nur aktualisieren, Dob, und lassen Sie alle anderen Felder, wie genau Sie sind, hier ist, wie ich das tun.
Ersten, erstellen Sie eine Ansicht, Modell:
Nun schreiben Sie den code in etwa wie folgt (Sie müssen es ändern, um das Spiel Ihrer Kontext-Namen, etc):
Den MapToModel Methode könnte sogar noch komplizierter, und tun alle Arten von zusätzlichen Kontrollen vor der Vergabe des view-model-Felder der entity-Objekt.
Jedenfalls das Ergebnis, wenn SaveChanges aufgerufen wird, wird der folgende SQL:
So können Sie deutlich sehen, Entity Framework hat nicht versucht, die Aktualisierung der anderen Felder - nur die Dob-Bereich.
Ich weiß, in deinem Beispiel, die Sie vermeiden möchten Codierung jeder Zuordnung per hand, aber ich denke, dies ist der beste Weg. Sie stecken es Weg in deine VM damit es nicht Abfall Ihre Haupt-code, und auf diese Weise können Sie sorgen für die spezifischen Bedürfnisse (z.B. zusammengesetzte Typen gibt, Datenvalidierung, etc.). Die andere option ist die Verwendung einer AutoMapper, aber ich glaube nicht, dass Sie sicher sind. Wenn Sie ein AutoMapper und Dinkel - "Dob", als "Doob" in Ihrem VM-würde es nicht anzeigen "Doob" , "Dob", noch würde es Ihnen sagen, über Sie! Es würde fehl, würde der Benutzer denken, alles war ok, aber die änderung nicht gespeichert.
In der Erwägung, dass, wenn Sie Dinkel - "Dob", als "Doob" in Ihrem VM-der compiler warnt Sie, dass der MapToModel() verweist, die "Dob" aber Sie haben nur eine Eigenschaft in der VM als "Doob".
Ich hoffe das hilft dir.
InformationsquelleAutor Laurence Frost
Ich schwöre bei EntityFramework.Erweitert. Nuget-Link
Er lässt Sie schreiben:
Ist sehr klar übersetzt in SQL.
EntityFramework.Erweitert. Es wird ein nuget-Paket.
Es ist raffiniert, aber ich habe festgestellt, dass es nicht wirklich helfen, wenn EF in Verbindung mit Web API 2, weil die
.Update()
Methode zum instanziieren der Typ (sonst erhalten Sie eineMemberInitException
). Wenn ich das wollen, ich brauche ein Mittel, die Schleife durch die Eigenschaften auf meiner inbound-Objekt zu instanziieren der neuen gesetzlich genannten Methode 🙁Ich nicht Folgen. Ich glaube nicht, dass
Update
tatsächlich instanziiert das Objekt. Es dauert eineExpression<Func<...>>
die analysiert, wie ein AST und verwandelte sich in SQL.InformationsquelleAutor Visser
Ich habe mein Problem gelöst indem FormCollection, Liste, verwendete element im Formular, und ändern Sie nur diejenigen Spalten in der Datenbank.
Ich habe mein code-Beispiel unten; schön, wenn es helfen kann jemand anderes
InformationsquelleAutor 10K35H 5H4KY4
Bitte versuchen Sie es auf diese Weise
InformationsquelleAutor Arkar Moe