2017-03-04 4 views
0

Ich weiß, es gibt eine Menge Fragen mit der Antwort zu diesem Thema, aber ich kann nicht etwas zu meinem Szenario finden.DBContext generiert im Controller, immer noch Die Beziehung zwischen den beiden Objekten ... verschiedene ObjectContext-Objekte

Im bekommen „Die Beziehung zwischen den beiden Objekten kann nicht definiert werden, da sie auf verschiedene Objekte Object gebunden sind“ auf Inventory CurrentInventory = db.Inventories.Find(injection.InventoryID);

Dies das erste Mal arbeitete ich es lief und nachfolgende Versuche scheitern alle.

Ich verstehe nicht, wie ich verschiedene Kontextobjekte bekomme.

Mein Controller:

public class InventoriesController : Controller 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 

    // GET: Inventories/Edit 
    public ActionResult Edit() 
    { 
     return View(db.Inventories.ToList()); 
    } 

    // POST: Inventories/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(List<Inventory> inventory) 
    { 
     //List<Inventory> inventory 
     if (inventory == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     foreach (Inventory injection in inventory) 
     { 
      Inventory CurrentInventory = db.Inventories.Find(injection.InventoryID); 
      CurrentInventory.Date = DateTime.Now; 
      CurrentInventory.Quantity = injection.Quantity; 
      CurrentInventory.LastChangedBy = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 
     } 

     if (ModelState.IsValid) 
     { 
     // db.Entry(inventory).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(EntityState.Modified); 
    } 
} 

EDIT:

ich zu einer einzigen Aktualisierung Methodik ging zurück, nur um festzustellen, ob das helfen würde. Ich habe immer noch den gleichen Fehler bekommen. Also habe ich es mit einer meiner anderen Controller-Edit-Methoden verglichen und festgestellt, dass ich die .Find() -Methode nicht verwendet habe, sondern über sie selbst iteriert und das gewünschte Objekt zurückgegeben habe. Das Problem wurde behoben.

// GET: Inventories/Edit/5 
     public ActionResult Edit(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Inventory inventory = db.Inventories.Find(id); 
      ViewData["Id"] = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

      if (inventory == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(inventory); 
     } 

     // POST: Inventories/Edit/5 
     // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
     // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit([Bind(Include = "InventoryID,Quantity,LastChanged,Date")] Inventory inventory) 
     { 
      Inventory oldInventory = null; 
      foreach (var a in db.Inventories) 
      { 
       if (a.InventoryID == inventory.InventoryID) 
       { 
        oldInventory = a; 
       } 
      } 

      if (oldInventory == null) 
      { 
       return HttpNotFound(); 
      } 

      if (ModelState.IsValid) 
      { 
       //db.Entry(inventory).State = EntityState.Modified; 
       TryUpdateModel(oldInventory); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(inventory); 
     } 

Follow-up-Frage:

Ist die .Find() -Methode eine weitere DbContext bei der Umsetzung schaffen, so dass zurückgegebenen Objekte vollständig von Natur aus einem anderen Kontext sind?

Antwort

0

Iterieren über den privaten Kontext in der Steuerung und die Rückgabe des Objekts benötigt anstelle der .Find() -Methode löste mein Problem, obwohl ich nicht zu scharf auf den Grund bin.

+0

Sie sollten Inventar CurrentInventorydb.Inventories.Find (x => x.InventoryID == injection.InventoryID); –

Verwandte Themen