2012-05-02 73 views
0

在我的控制器中,我創建了一個子類別對象,併爲該對象提供了它所屬類別的引用。一切工作正常,當我調試網站,但是當我從我的實體框架數據庫加載對象的列表中刪除所有類別的對象引用。其餘的依然存在。有人知道爲什麼發生這種情況?在實體框架中沒有正確保存對象引用

控制器:

[Authorize(Roles = "administrator")] 
    [HttpPost] 
    public ActionResult Create(CategoryViewModel viewmodel, HttpPostedFileBase Icon) 
    { 
     SubCategory subcategory = new SubCategory(); 
     Category category = categorycontroller.getCategoryByName(viewmodel.SelectedValue); 

     viewmodel.subcategory.Category = category; 
     subcategory = viewmodel.subcategory; 
     category.Subcategories.Add(subcategory); 

     if (Icon != null && Icon.ContentLength > 0) 
     { 
      var fileName = Path.GetFileName(Icon.FileName); 

      var path = Path.Combine(Server.MapPath("../../Content/icons/"), fileName); 
      Icon.SaveAs(path); 
      subcategory.Icon = fileName; 
     } 

     if (ModelState.IsValid) 
     { 
      subcategorydb.categories.Attach(category); 
      subcategorydb.subcategories.Add(subcategory); 
      subcategorydb.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>(); 
     } 
    } 
} 

這裏是我的類別和子類別類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.Entity; 

namespace SkyLearn.Areas.Categories.Models 
{ 
    public class Category 
    { 
     public int ID { get; set; } 
     public string Title { get; set; } 
     public string Icon { get; set; } 
     public string Description { get; set; } 
     public List<SubCategory> Subcategories; 

     public Category() 
     { 
      Subcategories = new List<SubCategory>(); 
     } 
    } 

    public class CategoryDBContext : DbContext 
    { 
     public DbSet<Category> categories { get; set; } 
     public DbSet<SubCategory> subcategories { get; set; } 
    } 
} 


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.Entity; 
using SkyLearn.Areas.Categories.Controllers; 

namespace SkyLearn.Areas.Categories.Models 
{ 
    public class SubCategory 
    { 
     public int ID { get; set; } 
     public string Title { get; set; } 
     public string Icon { get; set; } 
     public string Description { get; set; } 
     public int CategoryID { get; set; } 
     public Category Category { get; set; } 
    } 

    public class SubCategoryDBContext : DbContext 
    { 
     public DbSet<SubCategory> subcategories { get; set; } 
     public DbSet<Category> categories { get; set; } 
    } 
} 

我已經搜查了許多網站的信息這個問題,但無法找到很多的幫助。這裏有人能夠識別我的問題嗎?

正如在截圖中看到的那樣,對象被一切手段正確引用。但是當我下次加載數據時,對象引用已經消失。所有其他屬性仍然存在,並保存爲他們應該: Image displaying my debugg of the save process

感謝AronChan

////更新//// 現在我收到以下錯誤:

A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = SubCategory_Category ]

+0

你的兩個對象關係是否消失?您似乎有雙向關係:類別<-->子類別。你的數據庫表看起來如何? –

+0

是的,任何對象都沒有參考。我不是自己構造表,因爲我使用EntityFramework面向對象的數據庫它爲我自動完成所有的映射 – AronChan

+0

Subcategory是否也有一個'CategoryId',如果是的話,如果你明確設置'subCategory.CategoryId = category會發生什麼。 CategoryId'以及'subCategory.Category = category'? –

回答

2

你類別對象不會被保存,因爲它沒有附加到您將該子類別添加到的DbContext。子類可能知道引用,但類不會。如果有一個查找表(如果它有多對多的話就必須有),但我不知道如何保存這個記錄。嘗試附加類別,添加子類別然後保存。就我個人而言,我一直將多對多查找表設置爲自己的實體。可視化實際發生的事情要容易一些,而不是將所有控制權交給EF。

此外,如果您先使用代碼,請確保您的EntityConfigurations是正確的。嘗試在您的上下文中運行EdmxWriter,以確保數據模型看起來完全符合您的要求。

+0

當我將該對象附加到我的SubCategoryDBContext時,它給了我以下錯誤: A由於相應的主鍵值不存在,因此無法插入外鍵值。 [外鍵約束名稱= SubCategory_Category] ​​ – AronChan

+0

子類別是否具有categoryId或parentId屬性?確保你將其設置爲category.Id。我假定它的named parentId或類似的東西 - EF將無法通過約定找到該FK,除非您將其映射到您的實體配置中或專門設置它。 –

+0

是子類別對象有一個CategoryID屬性(int)。假設我的subcategoryDBContext應該包含一個DBset類別對象並且我應該將我的類別對象附加到該上下文是否正確? – AronChan