Laden...

EF4: Update von POCO Entity

Erstellt von Abt vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.752 Views
Abt Themenstarter:in
16.842 Beiträge seit 2008
vor 13 Jahren
EF4: Update von POCO Entity

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

2.891 Beiträge seit 2004
vor 13 Jahren

Was macht denn die TryUpdateModel-Methode?
Eigentlich sollte doch ein Attach an den Context reichen, oder?

Abt Themenstarter:in
16.842 Beiträge seit 2008
vor 13 Jahren

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.

1.002 Beiträge seit 2007
vor 13 Jahren

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

Abt Themenstarter:in
16.842 Beiträge seit 2008
vor 13 Jahren

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.... 😭

1.002 Beiträge seit 2007
vor 13 Jahren

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 keine InvalidOperationException-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

Abt Themenstarter:in
16.842 Beiträge seit 2008
vor 13 Jahren

Dann musste nach meinem Verständnis nur die Exception unterdrückt werden; das Model jedoch trotzdem ein Update erhalten 😉

Abt Themenstarter:in
16.842 Beiträge seit 2008
vor 13 Jahren

Also das TryUpdateModel() funktioniert in einer anderen Test-Solution.
Wieso das ganze hier jedoch nicht funktioniert, weiß ich leider nicht.