2016-07-23 5 views
0

Bitte HilfeAktualisierungsvorgang funktioniert nicht in MVC5 mit EF

Dies ist, wie ich bin Aktualisierung ....

[HttpPost, ActionName("Edit")] 
     public ActionResult Edit(Students model) 
     { 
     if (ModelState.IsValid) 
     { 
      using (DbAccess db = new DbAccess()) 
      { 

       var ID=db.students.Find(model.id); 
       db.Entry(ID).State = EntityState.Modified; 
       //ID.name = model.name; 
       //ID.address = model.address; 
       //ID.age = model.age; 
       //ID.email = model.email; 
       //ID.isActive = model.isActive; 

       db.SaveChanges(); 
      } 
     } 

     return View(model); 
    } 

In dem obigen Code, wenn Ich aktualisiere separat als es funktioniert gut, aber wenn ich db.Entry (...) ...... als es funktioniert nicht für mich und es zeigt auch keinen Fehler

Antwort

0

gerade diese ersetzen:

db.Entry(ID).State = EntityState.Modified; 
       //ID.name = model.name; 
       //ID.address = model.address; 
       //ID.age = model.age; 
       //ID.email = model.email; 
       //ID.isActive = model.isActive; 

mit:

UpdateModel(ID); 

und Sie werden in Ordnung;

Damit Ihre Methode funktioniert, müssen Sie wie dies zu tun:

db.Students .Attach(ID); 

var entry = db.Entry(ID); 
entry.State = EntityState.Modified; 

entry.Property(x => x.name).IsModified = true; 
entry.Property(x => x.address).IsModified = true; 
.... 
db.SaveChanges(); 

Grundsätzlich müssen Sie das aktualisierte Modell anhängen dann auf den Kontext zu erzählen, die Requisiten verändert werden.

ich in meinem Repository habe, eine andere Methode, die ich in einigen Situationen zu verwenden, wenn das Update nicht in der Steuerung durchgeführt wird, ist das Verfahren:

public void Update(TEntity newEntity) 
{ 
    var oldEntity = Context.Set<TEntity>().Find(newEntity.Id); 

    Context.Entry(oldEntity).CurrentValues.SetValues(newEntity); 
} 

In diesem Verfahren wird die newEntity aus dem comming Ansicht, und die oldEntity stammt aus dem Kontext.

UpdateModel kann nur in Steuerungen verwendet werden, wenn ich das Update außerhalb des Controllers aufrufen, verwende ich die obige Methode. Ich bevorzuge diese Methode, weil ich nicht explizit sagen muss, welche Requisiten modifiziert wurden. Wenn Sie ein Formular mit 10 Requisiten haben und der Benutzer nur 3 oder 4 aktualisiert, benötigen Sie viel Logik, um zu bestimmen, welche Änderungen vorgenommen wurden.

PS - meine Entitäten alle implementieren IEntityId, die eine Schnittstelle mit gemeinsamen Eigenschaften ist, wie Id, UpdateDate, Insert ..., das ist, warum ich newEntity.Id

+0

Sie mehr über 'UpdateModel' hier lesen: https: // msdn.microsoft.com/en-us/library/system.web.mvc.controller.updatemodel (v = vs.118).aspx –

+0

Vielen Dank @Lucian es funktioniert wirklich für mich, aber können Sie bitte erklären, warum db.Entry (ID) .State = EntityState.Modified; funktioniert nicht?? Und diese beiden Methoden sind gleich? thnxx – Heartlion

0

aufrufen Wenn Sie var ID=db.students.Find(model.id);

tun

Sie brauchen nicht db.Entry(ID).State = EntityState.Modified;

zu verwenden, weil, wenn Sie Find tun Sie reales Objekt Ihrer DbContext haben, wenn Sie Änderungen an machen (außer es Primärschlüsseln natürlich), Ihre SaveChanges wird es erkennen und entsprechend aktualisieren.

Sie müssen nur eingestellt State, wenn Sie so etwas wie dieses

Students students = new Students(); //a new object which is not created using `Find` 
students.name = "Heartlion"; 
students.address = "address text"; 

db.Entry(students).State = EntityState.Modified; 
db.SaveChanges(); 
+0

yeah du bist richtig, aber meine Frage ist warum und wo db.Entery(). State = ...... – Heartlion

0

Sie können versuchen, tun ...

[HttpPost, ActionName("Edit")] 
     public ActionResult Edit(Students model) 
     { 
      if (ModelState.IsValid) 
     { 
       using (DbAccess db = new DbAccess()) 
     { 

        var ID = db.students.Find(model.id); 
     //db.Entry(ID).State = EntityState.Modified; 
     ID.name = model.name; 
     ID.address = model.address; 
     ID.age = model.age; 
     ID.email = model.email; 
     ID.isActive = model.isActive; 

     db.SaveChanges(); 
     } 
     } 

     return View(model); 
     }