2009-05-21 24 views
3

Wie kann ich stark typisierte Controller mit EntityObjects verwenden?Entity Framework mit ASP.NET MVC

Meine Ausfälle ...

Zuerst das ich versucht:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

Dies scheiterte tatsächlich in die Datenbank alle Änderungen zu speichern. Also habe ich versucht, das Modell zu meinem Object anbringt: „ein Objekt mit einem Null-EntityKey Wert kann nicht auf einem Objektkontext angebracht werden“

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    db.Attach(Model); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

Dies schlug fehl, weil Also habe ich versucht, die EntityKey zuzuweisen: „. Ein Objekt mit demselben Schlüssel bereits in der Object existiert Object nicht mehrere Objekte mit dem gleichen Schlüssel verfolgen können“

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    Model.EntityKey = (from Department d in db.Department 
         where d.Id == id 
         select d).FirstOrDefault().EntityKey; 
    db.Attach(Model); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

Dies schlug fehl, weil

Wie soll das funktionieren?

+0

http://stackoverflow.com/questions/922402/strongly-typed-asp-net-mvc-with-ado-net-entity-framework –

Antwort

1

Versuchen db.AttachTo() anstelle von db.Attach()

Wie here beschrieben

„AttachTo auf Object Rufen Sie das Objekt an eine bestimmte Einheit im Objektkontext gesetzt zu befestigen. Auch dies tun Wenn das Objekt einen EntityKey-Wert null (Nothing in Visual Basic) hat. "

Bearbeiten: tatsächlich müssen Sie in diesem Fall möglicherweise ApplyPropertyChanges() aufrufen.

Edit 2: Sie können eine Entität Schlüssel für Ihr Objekt mit Code wie dem folgenden Aufbau:

public EntityKey GetEntityKey(string entitySetName, object keyValue) 
{ 
    IEnumerable<KeyValuePair<string, object>> entityKeyValues = 
    new[] 
    { 
     new KeyValuePair<string, object>("Id", keyValue) 
    }; 

    var key = new EntityKey(string.Concat("YOUR_OBJECT_CONTEXT_NAME.", entitySetName), entityKeyValues); 
    return key; 
} 

Und dann würden Sie diese, wie dies für Entitätsschlüsseln mit etwas rufen, basierend auf einer einzigen Datenbank Spalte namens 'Id':

var entityKey = GetEntityKey ("Kunde", 23);

Ich verwende eine ähnliche Methode in meinem eigenen EF-Code außer mit einem generischen Typ-Argument, um zu vermeiden, eine Zeichenfolge für den Namen der Entitätsklasse verwenden zu müssen.

+0

Dies funktioniert: Model.EntityKey = ...; db.ApplyPropertyChanges ("Abteilung", Modell); db.SaveChanges(); –

+0

Aber gibt es eine Möglichkeit, eine Datenbankabfrage zum Ermitteln des EntityKey nicht durchführen zu müssen? –

+0

http://StackOverflow.com/Questions/898260/What-value-for-qualifidentitysetname-do-i-need-for-an-titykey-Constructor –

3

Die Sache ist, was Sie haben, als Ihre Eingabe ist kein vollständiges Modellobjekt mit geänderten Eigenschaften - es ist nur ein "Start" von neuen, mit allen Eigenschaften, die Sie auf eine bereits vorhandene Entität überschreiben möchten. Du postest keine der ID-Eigenschaften,

Das sieht ein wenig wortreich aus, aber es ist das Beste, was ich gefunden habe, so ist es, wie ich es in meinen Projekten (angepasst an Ihre Klassennamen, mit was auch immer war) fehlend gemacht ...):

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Guid id, Department Model) 
{ 
    var dbDepartment = (from Department d in db.Department 
         where d.Id == id 
         select d).FirstOrDefault() as Department 

    dbDepartment.Name = Model.Name; 
    dbDepartment.Color = Model.Color; 
    // etc, assigning values manually... 

    try 
    { 
     db.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     // oops... 
    } 
    return RedirectToAction("Index"); 
} 
+3

Das sieht nicht wirklich wie ein Schritt vorwärts;). – Morph

+1

Nicht, wenn es darauf ankommt, ist schöner Code. Das ist nicht schön ... Aber es funktioniert, also verglichen mit Code, der es nicht tut, muss ich sagen, es ist ein Schritt vorwärts! ;) –

0

Ich rate nicht, ein POCO in Ihre MVC-Anwendung zu verwenden. Sie sollten ein DTO oder ein Modell verwenden.

Vielleicht sollten Sie ein Objekt vor der ID abrufen und dann die von Ihnen übergebenen Werte durch die Methode edit ersetzen und dann die Änderungen speichern. Sie erhalten einen Fehler, weil Sie das Modell nicht von vornherein gelöst haben.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model) {
var entity=from m in db.Models where m.Id == Model.id select m;
Model entityAttached=entity.FirstOrDefault();
//replace all the new values in you object
db.SaveChanges();
}

oder deattach Objekt, wenn Sie es von ID erhalten und befestigen Sie es zurück, wenn Sie die neuen Werte im Bearbeitungsmethode speichern möchten.

1

Wie über diese

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, Department dept) 
{ 
    Department tmp = new Department() 
    { 
     Id = dept.Id 
    }; 
    try 
    { 
     db.Departments.Attach(dept, tmp); 
     db.Save(); 
    } 
} 

Vielleicht ist der tmp-Teil kann für einen Anruf an Update nach dem Teil Attach ausgetauscht werden, aber ich bin mir nicht sicher.

Edit: Just nachgeschlagen die Dokumentation auf Anhängen (Entity e, Entity original) und es tatsächlich ersetzt Original mit e (oder Original entsprechend aktualisieren oder w/e).

Verwandte Themen