Hi,
da es sich speziell um eine Web-Angelegenheit handelt, stell ich die Frage gemäß im Web-Bereich.
Ich habe POCO-Entities, die mir anhand meines EDMX-Modells durch den POCO Entity Generator erstellt werden.
In meiner Edit(int id) Action meiner MVC3 Anwendung suche ich mir das gewünschte Entity anhand der ID aus und übergebe dies durch ein Model der View:
public ActionResult Edit( int id )
{
NewModel view = new NewModel { Mode = DefinitionMode.EDIT };
view.Definition = EntityRepository.Get( x => x.ID.Equals( ( int ) id ) );
return View( "Index", view );
}
Meine Save(Entity model)-Funtion soll nun die geänderten Werte speichern.
public ActionResult Save( Entity model, DefinitionMode mode)
{
if( mode == DefinitionMode.EDIT )
TryUpdateModel( model );
if( mode == DefinitionMode.NEW )
EntityRepository.Add( model );
EntityRepository.SaveChanges( );
return View( "Index" );
}
Fehlermeldung:
Ein doppelter Schlüssel kann in das 'dbo.EntitySet'-Objekt nicht eingefügt werden.
Das Abspeichern einer neuen Entity ist absolut kein Problem - aber wie muss ich POCOs behandeln, um ein Update einer Entity zu erreichen, ohne diese Löschen zu müssen?
Hierbei sei gesagt, dass die ID lediglich ein Auto-Increment aber kein Schlüssel ist, sondern 5 andere Spalten (Ein String Feld und 4 Integer-Felder).
Für sachdienliche Hinweise bin ich sehr dankbar!
Grüße vom Abt
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Was macht denn die TryUpdateModel
-Methode?
Eigentlich sollte doch ein Attach an den Context reichen, oder?
TryUpdateModel
sollte im gegebenen Context das vorhandene Model aktualisieren ( ist das Gegenstück zu ApplyCurrentChanges() in der MVC-Umgebung), sodass ein SaveChanges (steckt hinter Save()) ausreichen sollte.
Bei einem Attach( model ) bekomme ich die Fehlermeldung, dass das bestehende Entity bereits den State Added
besitzt - auch den Neusetzen von Modified via ObjectStateManager gibt den gleichen Error.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt,
meines Wissen nach ändert UpdateModel
das Model — TryUpdateModel
hingegen gibt nur einen boolschen Wert zurück, der angibt, ob das Model entsprechend aktualisiert werden kann, ohne es abzuändern.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo m0rius,
In der Doku steht:
public ActionResult Edit( Entity updated )
{
try
{
var originalObject = db.GetEntity( updated.ID );
TryUpdateModel( originalObject );
db.SaveChanges( );
return RedirectToAction( "Index" );
}
catch
{
return View( );
}
}
Ich sehe gerade aber, dass ich nicht das originale Model update, sondern das Context Model.... 😭
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt,
hier nochmal der feine Unterschied aus Controller.TryUpdateModel-Methode:
Die
[TryUpdateModel]
-Methode entspricht der[UpdateModel]
-Methode, mit dem Unterschied, dass die[TryUpdateModel]
-Methode keineInvalidOperationException
-Ausnahme auslöst, wenn der aktualisierte Modellzustand nicht gültig ist.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Dann musste nach meinem Verständnis nur die Exception unterdrückt werden; das Model jedoch trotzdem ein Update erhalten 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Also das TryUpdateModel()
funktioniert in einer anderen Test-Solution.
Wieso das ganze hier jedoch nicht funktioniert, weiß ich leider nicht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code