一个实体对象不能被 IEntityChangeTracker 的多个实例引用。无线
An entity object cannot be referenced by multiple instances of IEntityChangeTracker. Wi
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");
}
}
}
通过反复试验,我发现错误是由
引起的
model.Order.SalePerson = seller; model.Order.Customer = customer;
那些行。我想我需要以某种方式将那些从 usermanager 中分离出来,但我不知道如何。我怎么解决这个问题?提前谢谢你。
这是因为您正在合并来自 DbContext 的 2 个不同实例的实体。
UserManager
中的卖家和客户有自己的实例。
- 控制器构造函数中的
dbContext = new ApplicationDbContext()
您需要使用同一个实例。有很多方法可以做到这一点。其中之一是依赖注入。
或者,根据您的代码,我想您可以调用:
HttpContext.GetOwinContext().Get<ApplicationDbContext>();
这将为您提供与 UserManager 相同的 DbContext 实例,但我认为您不能在构造函数中调用它。您必须在操作函数中调用它或创建一个像 UserManager 一样的 属性。
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");
}
}
}
通过反复试验,我发现错误是由
引起的model.Order.SalePerson = seller; model.Order.Customer = customer;
那些行。我想我需要以某种方式将那些从 usermanager 中分离出来,但我不知道如何。我怎么解决这个问题?提前谢谢你。
这是因为您正在合并来自 DbContext 的 2 个不同实例的实体。
UserManager
中的卖家和客户有自己的实例。- 控制器构造函数中的
dbContext = new ApplicationDbContext()
您需要使用同一个实例。有很多方法可以做到这一点。其中之一是依赖注入。
或者,根据您的代码,我想您可以调用:
HttpContext.GetOwinContext().Get<ApplicationDbContext>();
这将为您提供与 UserManager 相同的 DbContext 实例,但我认为您不能在构造函数中调用它。您必须在操作函数中调用它或创建一个像 UserManager 一样的 属性。