2012-05-02 74 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