2017-03-04 6 views
0

이 항목에 대한 답변과 관련하여 많은 질문이 있지만 실제로는 내 시나리오와 관련이없는 것으로 보입니다.DBContext가 컨트롤러에서 생성 된 경우 여전히 두 개체 간의 관계 ... 다른 ObjectContext 개체

임이 모두 실패 내가 그것을 실행 처음으로 후속 시도를했다 Inventory CurrentInventory = db.Inventories.Find(injection.InventoryID);

에 "그들은 서로 다른 ObjectContext의 객체에 부착되어 있기 때문에 두 개체 사이의 관계를 정의 할 수 없습니다"점점.

다른 컨텍스트 개체를 얻는 방법을 이해하지 못합니다.

내 컨트롤러 :

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 메서드를 비교해 보았습니다. 대신에 .Find() 메서드를 사용하지 않고, 레코드를 반복하여 원하는 개체를 반환했습니다. 그렇게 할 때 문제가 해결되었습니다.

// 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); 
     } 

후속 질문 :

는 .Find() 메소드는 그 객체가 완전히 다른 문맥에서 본질적이다 반환 있도록 구현에서 다른 dbContext을 만들 수 있습니까?

답변

0

컨트롤러의 개인 컨텍스트를 반복하고 .Find() 메서드를 사용하는 대신 필요한 개체를 반환하는 것은 내 문제를 해결했습니다. 이유는 그다지 열망하지는 않습니다.

+0

인벤토리 CurrentInventorydb.Inventories.Find (x => x.InventoryID == injection.InventoryID); –