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

試行錯誤の結果、エラーが原因であることがわかりました

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

それらの行。どうにかしてそれらをユーザーマネージャーから切り離す必要があると思いますが、方法がわかりません。どうすればこの問題を解決できますか? 前もって感謝します。

4

1 に答える 1

0

これは、DbContext の 2 つの異なるインスタンスからエンティティをマージしているためです。

  • UserManager売り手と顧客が独自のインスタンスを持っています。
  • コントローラーのdbContext = new ApplicationDbContext()コンストラクター内。

同じインスタンスを使用する必要があります。これを行うには多くの方法があります。その 1 つが依存性注入です。

または、あなたのコードに基づいて、次のように呼び出すことができると思います:

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

これにより、UserManager と同じ DbContext のインスタンスが得られますが、コンストラクターで呼び出すことはできないと思います。アクション関数でこれを呼び出すか、UserManager のようなプロパティを作成する必要があります。

于 2016-03-23T02:54:00.590 に答える