Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net MVC控制器不在内存数据库中持久化_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# asp.net MVC控制器不在内存数据库中持久化

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()

我只需在表格上输入姓名和年龄,然后将其发布到我家控制器中的ListAll操作。但是控制器不记得输入的所有姓名和年龄,即,它不会保存它

顺便说一句,很抱歉代码太长,但它都很基本,不应该使事情复杂化

这是我Index.Html中的代码(在这里我可以输入一个人的姓名和年龄)

我的控制器

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;