当我重定向到另一个控制器时,我的堆栈丢失了其值

时间:2019-06-16 00:52:43

标签: c#

我已经尝试过使用列表,它保留了很好的值,但是当我将其更改为堆栈时,该值丢失了。我一直在走,但我不明白为什么它消失了。

 public ActionResult AddToOrder()
        {
            //Get logged in student from db
            var student = _db.Students.Find(User.Identity.GetUserId());

            //Create a new Order
            var order = new Order();

            //add all elements from Student collection to Order collection
            foreach (var app in student.Applications)
            {
                order.Applications.Add(app);
            }

            //assign order FK 
            order.StudentId = User.Identity.GetUserId();

            //Push the order to the students Stack collection 
            student.Orders.Push(order); //(When the Student implements a List collection the value 
                                    //passes to the Stripe controller with no problems)

            //add order to db & save changes
            _db.Orders.Add(order);
            _db.SaveChanges();

            //redirect to stripe controller
            return RedirectToAction("Create", "Stripe");

        }

        //STRIPE CONTROLLER
         public ActionResult Create(string stripeToken)
        {
            var student = _db.Students.Find(User.Identity.GetUserId());
            student.Orders.Count // = 0 with Stack
                                 // = 1 with List
        }    

我唯一要更改的是“学生”实体中的“堆栈到列表”,然后按添加。有人有什么想法吗?

我想我可以通过使用列表来实现我想要的(LIFO)。我仍然想知道堆栈中发生了什么。

myList.Insert(0,顺序)---我的List.First()

1 个答案:

答案 0 :(得分:1)

Student是一个Entity Framework实体-数据库表的对象表示。它的Orders属性表示与另一个表的关系。当您将订单对象添加到Student的{​​{1}}属性中时,Entity Framework会进行大量操作,以确保正确写入所有对象数据当您调用Orders时,使用所有正确的外键等作为表数据存储到数据库。当您调用SaveChanges时,同样的事情:有很多事情在将您的代码转换为SQL查询,运行它,然后将生成的SQL表数据转换为方便的Students.Find对象。

实体框架会自动完成所有操作,但是为了使其正常工作,需要以特定方式定义Student之类的实体类,以使EF知道如何处理它们。简而言之:表示与另一个表的关系的属性Student必须为Orders。当您将List重新定义为Student.Orders时,实体框架机制将中断,EF无法再使用Stack来处理数据库的那部分。

当您的应用程序从一个控制器重定向到另一个控制器时,订单数据不会保留在应用程序的内存中,而仅保留在数据库中。加载目标控制器后,您的代码将尝试从数据库中加载以前的控制器应该保存在其中的数据。正在发生两件事之一:

  • 您使用Orders所做的更改破坏了Stack实体,因此数据根本不会保存到数据库中,或者
  • 实体框架可以设法很好地处理Students保存数据,但不能加载

我不确定此特定更改是在发生什么,但是任何一个都不可取。

Stack必须是Orders。如果需要保留对列表的某种排序,则需要在数据模型中将其明确显示,以便最终在数据库中使用。也许您的List类需要一个Order属性或类似的属性。如果您这样做,请记住必须同时更新代码。搜索“ Entity Framework迁移”以获取有关此信息,并询问是否遇到其他问题。