2016-03-21 7 views
0
namespace BoatShop.Controllers 
{ 
    public class ManagerController : Controller 
    { 
    ApplicationDbContext dbContext; 
    public ManagerController() 
    { 
     dbContext = new ApplicationDbContext(); 
    } 
    public ManagerController(ApplicationUserManager userManager) 
    { 
     UserManager = userManager; 
    } 
    private ApplicationUserManager _userManager; 
    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

    public ActionResult Index() 
    {return View();} 

    public ActionResult ViewBoats() 
    { 
     var allBoats = dbContext.Boats.Where(x => x.isArchived == false).ToList(); 
     return View(allBoats); 
    } 

    public ActionResult MakeOrder(int boatId) 
    { 
     OrderViewModel model = new OrderViewModel 
     { 
      boatId = boatId, 
      boatName = dbContext.Boats.FirstOrDefault(x => x.Id == boatId).Name, 
      ManagerName = User.Identity.Name, 
      userList = dbContext.Users.ToList() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult MakeOrder(OrderViewModel model) 
    { 
     model.Order.Boat = dbContext.Boats.FirstOrDefault(x=>x.Id==model.boatId); 
     ApplicationUser seller = UserManager.FindById(User.Identity.GetUserId()); 
     ApplicationUser customer = UserManager.FindById(model.CustomerId); 
     model.Order.SalePerson = seller; 
     model.Order.Customer = customer; 
     model.Order.CreationDate = DateTime.Now; 
     var order = model.Order; 
     dbContext.Orders.Add(order); 
     dbContext.SaveChanges(); 
     return RedirectToAction("Index"); 
     } 
    } 
} 

von Trial-and-Error-i haben, dass Fehler herausgefunden, durchEin Entitätsobjekt kann nicht von mehreren Instanzen von IEntityChangeTracker referenziert werden. Wi

verursacht wird
model.Order.SalePerson = seller; model.Order.Customer = customer; 

diese Richtung. Ich denke, dass ich diese aus dem usermanager irgendwie lösen muss, aber ich habe keine Ahnung wie. Wie kann ich dieses Problem lösen? Vielen Dank im Voraus.

+0

möglich duplizieren: http://stackoverflow.com/questions/10191734/entity-object-cannot-be-referenced-by-multiple-instances-of-ientitychangetracker –

Antwort

0

Dies liegt daran, dass Sie Entitäten aus zwei verschiedenen Instanzen eines DbContext zusammenführen.

  • Die UserManager, aus der der Verkäufer und Kunde, hat eine eigene Instanz.
  • Die dbContext = new ApplicationDbContext() im Konstruktor des Controllers.

Sie müssen dieselbe Instanz verwenden. Es gibt viele Möglichkeiten, dies zu tun. Eine davon ist die Abhängigkeitsinjektion.

Oder basierend auf Ihren Code, ich denke, dass man nur nennen könnte:

HttpContext.GetOwinContext().Get<ApplicationDbContext>(); 

Sie Dies gibt die gleiche Instanz der DbContext als Usermanager aber ich denke, Sie es nicht in die anrufen Konstrukteur. Sie müssen dies in der Aktionsfunktion aufrufen oder eine Eigenschaft wie den UserManager erstellen.