对象引用在 db.savechanges上丢失.为什么

本文关键字:为什么 savechanges db 对象引用 | 更新日期: 2023-09-27 18:32:54

在我的控制器中,我正在创建一个新的子类别对象并将其保存到我的数据库中,如下所示:

    [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);
    }

调试应用程序后,我注意到控制器正确保存了我的所有数据,包括对新创建的子类别中的类别对象的引用。

但是问题是当我稍后在子类别上从我的数据库加载数据时,对象缺少对我的类别对象的引用。

我的视图模型如下所示:

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;
}

为什么我的类别对象引用消失了?我瞎了眼。

对象引用在 db.savechanges上丢失.为什么

这里释放的是 DbContext 对象,它是控制器类中的一个实例变量。这在您发布的代码中不可见。MVC 脚手架代码生成器将其放在那里(以及 Dispose() 方法)。它的工作方式是,当请求进来时,创建控制器,其中的方法运行,然后,控制器在请求结束时超出范围。如果你去掉Dispose()方法,它仍然有效。但是,最好将其放在那里,因为它正在释放 DbContext 对象,该对象是可 IDposable。利用本机资源(如数据库连接)的类实现 IDisposable。这意味着你应该在它们上显式调用 Dispose()。否则,数据库连接可能会保持打开状态并导致连接池泄漏,直到垃圾回收器在某个不确定的时间完成对象。有关详细信息,请参阅 MSDN 文档中有关 IDispose 的文档。