【问题标题】:An entity object cannot be referenced by multiple instances of IEntityChangeTracker. Wi一个实体对象不能被多个 IEntityChangeTracker 实例引用。无线
【发布时间】:2016-07-08 11:49:16
【问题描述】:
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;

那些行。我想我需要以某种方式将它们从用户管理器中分离出来,但我不知道如何。我怎么解决这个问题?提前谢谢你。

【问题讨论】:

标签: c# asp.net-mvc entity-framework usermanager


【解决方案1】:

这是因为您正在合并来自 DbContext 的 2 个不同实例的实体。

  • UserManager 卖家和客户从中拥有自己的实例。
  • 控制器构造函数中的dbContext = new ApplicationDbContext()

您需要使用相同的实例。有很多方法可以做到这一点。其中之一是依赖注入。

或者,根据您的代码,我猜您可以调用:

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

这将为您提供与 UserManager 相同的 DbContext 实例,但我认为您不能在构造函数中调用它。您必须在操作函数中调用它或创建一个类似于 UserManager 的属性。

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多