我已经尝试过使用列表,它保留了很好的值,但是当我将其更改为堆栈时,该值丢失了。我一直在走,但我不明白为什么它消失了。
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()
答案 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迁移”以获取有关此信息,并询问是否遇到其他问题。