0

在我的控制器中,我正在创建一个子类别对象并为该对象提供对其所属类别的引用。当我调试站点时一切正常,但是当我从我的 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);
    }

这是我的视图模型:

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

我搜索了许多网站以获取有关此问题的信息,但找不到太多帮助。这里有人能够识别我的问题吗?

如在此屏幕截图中所见,该对象已通过各种方式正确引用。但是当我下次加载数据时,对象引用消失了。所有其他属性仍然存在并按应有的方式保存: 显示我的保存过程调试的图像

感谢 AronChan

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

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

4

1 回答 1

2

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

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

于 2012-05-02T14:01:30.450 回答