在我的控制器中,我正在创建一个子类别对象,并为该对象提供它所属类别的引用。当我调试网站时,一切正常,但当我从我的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; }
}
}
我搜索了许多网站以获取有关此问题的信息,但无法找到很多帮助。这里有人能够识别我的问题吗?
如此屏幕截图所示,通过各种方式正确引用了对象。但是当我下次加载数据时,对象引用已经消失了。所有其他属性仍然存在并保存为:
感谢AronChan
////更新//// 我现在收到以下错误:
无法插入外键值,因为相应的主键 键值不存在。 [外键约束名称= SubCategory_Category]
答案 0 :(得分:2)
您的类别对象将不会被保存,因为它未附加到您添加子类别的DbContext。子类别可能知道引用,但类别不会。如果有一个查找表(如果有多个那么必须存在),我看不出该记录将如何保存。尝试附加类别,添加子类别,然后保存。就个人而言,我总是将多对多查找表设置为自己的实体。可视化实际发生的事情要比将所有控制权交给EF更容易一些。
此外,如果您首先使用代码,请确保您的EntityConfigurations正确无误。尝试在您的上下文中运行EdmxWriter,以确保数据模型看起来完全符合您的预期。