对象引用未在实体框架中正确保存

时间:2012-05-02 10:46:54

标签: c# asp.net-mvc-3

在我的控制器中,我正在创建一个子类别对象,并为该对象提供它所属类别的引用。当我调试网站时,一切正常,但当我从我的entityframework db加载对象列表时,所有类别对象引用都被删除。其余的仍然存在。任何人都知道为什么会这样?

控制器:

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

这是我的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>();
        }
    }
}

这是我的Category和SubCategory类:

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

////更新//// 我现在收到以下错误:

  

无法插入外键值,因为相应的主键   键值不存在。 [外键约束名称=   SubCategory_Category] ​​

1 个答案:

答案 0 :(得分:2)

您的类别对象将不会被保存,因为它未附加到您添加子类别的DbContext。子类别可能知道引用,但类别不会。如果有一个查找表(如果有多个那么必须存在),我看不出该记录将如何保存。尝试附加类别,添加子类别,然后保存。就个人而言,我总是将多对多查找表设置为自己的实体。可视化实际发生的事情要比将所有控制权交给EF更容易一些。

此外,如果您首先使用代码,请确保您的EntityConfigurations正确无误。尝试在您的上下文中运行EdmxWriter,以确保数据模型看起来完全符合您的预期。