Erkennen Zustand zu ändern, der Modell-Eigentum, im controller, mit Entity Framework
Ich habe ein mehr oder weniger standard-Suche Modell:
public class Project {
public int ID { get; set; }
//... some more properties
public DateTime StartDate { get; set; }
public int Duration { get; set; }
}
Wenn der Benutzer ändert StartDate
oder Projekt Duration
habe ich eine Funktion aufrufen zu aktualisieren, eine simulation. Um dies zu erreichen, möchte ich zu erkennen, den Zustand zu ändern, der die Felder StartDate
und Duration
innerhalb eines Controllers.
Sowas:
if(project.StartDate.stateChange() || project.Duration.stateChange())
Hier ist ein Beispiel, was die Controller-Methode würde wie folgt Aussehen:
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
if(project.StartDate.stateChange() || project.Duration.stateChange())
doSomething();
db.Entry(project).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(project);
}
Jede Idee, wie kann ich das erreichen?
InformationsquelleAutor Chopo87 | 2013-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, vergleichen kann man die bearbeiteten Entität, die mit der ursprünglichen aus der Datenbank gelesen.
Etwas wie:
Mit oder ohne "db".Eintrag(original).State = EntityState.Geändert;'?
guter Punkt, lassen Sie mich versuchen,
Ok, ich stehe korrigiert, das scheint zu funktionieren, jedoch müssen Händisch zuweisen
original.value= project.value;
kann es ein bisschen chaotisch, dies kann gelöst werden, durch das ersetzendb.Entry(original).State = EntityState.Modified;
mitdb.Entry(original).CurrentValues.SetValues(project);
Bitte, respektieren Sie andere Benutzer dieser Website. Wenn Sie feststellen, jede Art von Fehler in der Antwort, bitte auf Bearbeiten und korrigieren. Nicht nur lassen "updates" in den Kommentaren, denn Kommentare sind Bürger zweiter Klasse hier-und können leicht übersehen werden. Immer versuchen Sie, die Antworten so genau wie möglich. Danke.
InformationsquelleAutor Stefan Szasz
Kann man es lösen, indem man trägt die alten Werte über ViewBag.
In Aktion:
Fügen Sie versteckte Elemente Anzeigen
Fügen Sie diese Parameter, um die post-Methode, und überprüfen Sie für änderungen
InformationsquelleAutor OrcaYlc
Wenn Sie wollen, es zu tun, ohne Abfrage Ihrer Persistenz layer ich denke, das hinzufügen der alten Werte als Felder in Ihr Modell und dann halten Sie in der Seite als hidden-fields ist der einfachste Weg, um dieses Problem zu lösen.
So fügen Sie CurrentStartDate und CurrentDuration in Ihrem Modell:
und fügen Sie dann die hidden-Felder mit den alten Werten in Ihrem Blick:
Dies wird Ihnen etwas zu vergleichen, der ausgewählte Werte mit in einer controller-action.
querying your persistence layer
, das klingt wie das, was ich versuche zu erreichen.Dann müssen Sie Holen Sie sich das aktuelle Projekt von db und überprüfen Sie die alten Werte und vergleichen Sie die Werte, Sie werden immer vom client aus.
Ich habe bereits versucht: ich bekomme die folgende exception
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
InformationsquelleAutor KMan
Verwenden .AsNoTracking().FirstOrDefault zum abrufen der ursprünglichen Objekts zum Vergleich:
InformationsquelleAutor Gene Stempel