C# asp.net MVC控制器不在内存数据库中持久化
我只需在表格上输入姓名和年龄,然后将其发布到我家控制器中的ListAll操作。但是控制器不记得输入的所有姓名和年龄,即,它不会保存它 顺便说一句,很抱歉代码太长,但它都很基本,不应该使事情复杂化 这是我Index.Html中的代码(在这里我可以输入一个人的姓名和年龄) 我的控制器C# asp.net MVC控制器不在内存数据库中持久化,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我只需在表格上输入姓名和年龄,然后将其发布到我家控制器中的ListAll操作。但是控制器不记得输入的所有姓名和年龄,即,它不会保存它 顺便说一句,很抱歉代码太长,但它都很基本,不应该使事情复杂化 这是我Index.Html中的代码(在这里我可以输入一个人的姓名和年龄) 我的控制器 public class HomeController : Controller { TheDB myDB ; public HomeController()
public class HomeController : Controller
{
TheDB myDB ;
public HomeController()
{
myDB = new TheDB();
}
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(Person person)
{
//ignore model validation for now
myDB.persons.Add(person);
myDB.SaveChanges(); //update: adding this didn't work either
return View(person);
}
public ActionResult ListAll()
{
return View(myDB.persons.ToList());
}
最后是ListAll.cshtml,它应该显示添加到内存数据库中的所有人,但它显示一个空白页
@model IEnumerable<HtmlForms.Models.Person>
@using HtmlForms.Models
@foreach(var p in Model )
{
@p.Name;
@p.Age;
}
@model IEnumerable
@使用HtmlForms.Models
@foreach(模型中的var p)
{
@p、 姓名;
@p、 年龄;
}
我错过了什么?如果我在ListAll方法中手动添加两个person对象,并将其传递给视图,则该方法有效。但上面的代码无效
谢谢myDB变量是
HomeController
类的实例变量。实例变量特定于类的一个实例,由于每次处理请求时都会创建HomeController
类的新实例,因此在处理请求时,内存中的对象将被创建,然后由垃圾收集器销毁
可以将变量设置为静态
,只实例化一次,如下所示:
static TheDB myDB;
public HomeController()
{
if (myDB == null)
{
myDB = new TheDB();
}
}
但是,这只会持续应用程序池运行的时间,默认情况下,应用程序池在一段时间的不活动(以及错误和其他情况,如操作系统崩溃)后停止
如果您希望在请求和应用程序池关闭期间持久化数据,则需要使用适当的数据库系统或将类序列化到某个文件中,以便可以重新加载该类。控制器的生存期不会跨越多个请求,所以,不可能让控制器拥有跨多个请求的内存数据库
您可以在应用程序启动时(在Global.asax.cs中)将数据库作为静态对象创建。但是,它不会“持久化”,因为它将在应用程序重新启动时重置。模型的Person类不包含主键字段,如 例如:int PersonId{get;Set;} 实体框架将很好地用于包含关键数据成员的实体。 所以试着这样做
public class Person
{
[Key]
public int Id {get; set;}
[Required]
public string Name { get; set; }
[Required]
public string Age{get;set;}
}
还可以尝试使用HttpContext.Cache来维护内存中的数据
HttpContext.Cache["Persons"]= MyDB.persons;
您是否随时调用
SaveChanges
将更改提交给数据库?我刚刚更新了问题。我根据您的建议添加了它,奇怪的是,它仍然不起作用:(您将实例TheDB
存储在哪里?如果只是myDB=new TheDB()
这将在每次页面加载时初始化一个空白数据库-您需要将其保存在某个位置。@RGraham TheDB在控制器的构造函数中初始化。它作为全局变量存储,正如您在控制器代码的第三行所看到的那样。我认为一个公共变量会保存下来?您提到您创建了index.html…您是指您吗r Index View?@iAteABug\u和\u iLiked\u请注意,将实例设置为静态将与所有向页面发出请求的用户共享该实例。@Sean,因此,当我使用实际数据库并使用Entityframework时,我的dbcontext类应该是静态的。@iAteABug\u和\u iLiked\u不,Entityframework只是数据库顶部的对象模型/访问层数据库系统负责为您提供数据持久性,因为大多数(如果不是全部的话)数据库系统都将数据存储在服务器的文件系统中。
static TheDB myDB;
public HomeController()
{
if (myDB == null)
{
myDB = new TheDB();
}
}
public class Person
{
[Key]
public int Id {get; set;}
[Required]
public string Name { get; set; }
[Required]
public string Age{get;set;}
}
HttpContext.Cache["Persons"]= MyDB.persons;