在我的控制器中,我正在创建一个新的子类别对象并将其保存到我的数据库中,如下所示:
[Authorize(Roles = "administrator")]
[HttpPost]
public ActionResult Create(CategoryViewModel viewmodel, HttpPostedFileBase Icon)
{
SubCategory subcategory = viewmodel.subcategory;
subcategory.Category = categorycontroller.getCategoryByName(viewmodel.SelectedValue);
if (Icon != null && Icon.ContentLength > 0)
{
// extract only the filename
var fileName = Path.GetFileName(Icon.FileName);
// store the file inside ~/App_Data/uploads folder
var path = Path.Combine(Server.MapPath("../../Content/icons/"), fileName);
Icon.SaveAs(path);
subcategory.Icon = fileName;
}
if (ModelState.IsValid)
{
db.subcategories.Add(subcategory);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(subcategory);
}
调试应用程序后,我注意到控制器正确保存了我的所有数据,包括对我新创建的子类别中类别对象的引用。
但问题是,当我稍后在子类别上加载数据时,对象缺少对类别对象的引用。
我的viewmodel看起来像这样:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Web.Mvc;
using SkyLearn.Areas.Categories.Controllers;
namespace SkyLearn.Areas.Categories.Models
{
public class CategoryViewModel
{
public List<SelectListItem> PossibleValues { get; set; }
public string SelectedValue { get; set; }
public SubCategory subcategory { get; set; }
public CategoryController categorycontroller;
public CategoryViewModel()
{
PossibleValues = new List<SelectListItem>();
}
}
}
我在找到对象的类别控制器上的方法:
public Category getCategoryByName(string categoryname)
{
foreach (Category cat in getCategories())
{
if (cat.Title == categoryname)
{
return cat;
}
}
return null;
}
为什么我的类别对象引用会消失?我是个盲人。
答案 0 :(得分:1)
这里配置的是DbContext对象,它是Controller类中的实例变量。这在您发布的代码中不可见。 MVC脚手架代码生成器将它放在那里(与Dispose()方法一起)。它的工作方式是,当一个请求进入时,创建Controller,其中的方法运行,然后,Controller在请求结束时超出范围。如果你拿出Dispose()方法,它仍然可以工作。但是,将它放在那里是很好的,因为它正在处理IDisposable的DbContext对象。使用本机资源(如数据库连接)的类实现IDisposable。这意味着您应该在它们上显式调用Dispose()。否则,数据库连接可能保持打开状态并导致连接池泄漏,直到垃圾回收器在某个未确定的时间完成对象。有关详细信息,请参阅MSDN文档中有关IDispose的文档。