2012-04-30 53 views
1

在我的控制,我創建一個新的子類對象,並將其保存到我的數據庫是這樣的:對象引用在db.savechanges上丟失。爲什麼?

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

爲什麼我的類對象的引用消失的傢伙?我在盲人。

回答

1

這裏所說的是DbContext對象,它是Controller類中的一個實例變量。這在您的發佈代碼中不可見。 MVC腳手架代碼生成器將其放在那裏(以及Dispose()方法)。它的工作方式是當請求進入時,Controller被創建,其中的方法運行,然後Controller在請求結束時超出範圍。如果您拿出Dispose()方法,它仍然可以工作。但是,最好將它放在那裏,因爲它正在處理一個IDisposable的DbContext對象。使用本地資源(如數據庫連接)的類實現IDisposable。這意味着你應該明確地調用Dispose()。否則,數據庫連接可能會保持打開狀態並導致連接池泄漏,直到垃圾收集器在某些未確定的時間完成對象。有關更多信息,請參閱MSDN文檔中有關IDispose的文檔。

+0

每次運行此方法時,刪除子類別對象上對我的類別對象的引用。任何其他屬性仍被定義爲當我保存它時。即時通訊不知道,但我認爲這與這種方法有關。也許我錯了? – AronChan

+0

我更新了我的問題,以更準確地反映我的問題 – AronChan

相關問題