C# 实体框架中未正确保存对象引用
在我的控制器中,我正在创建一个子类别对象,并为该对象提供它所属类别的引用。调试站点时一切正常,但从entityframework db加载对象列表时,所有类别对象引用都会被删除。其余的问题依然存在。有人知道为什么会这样吗 控制器:C# 实体框架中未正确保存对象引用,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,在我的控制器中,我正在创建一个子类别对象,并为该对象提供它所属类别的引用。调试站点时一切正常,但从entityframework db加载对象列表时,所有类别对象引用都会被删除。其余的问题依然存在。有人知道为什么会这样吗 控制器: [Authorize(Roles = "administrator")] [HttpPost] public ActionResult Create(CategoryViewModel viewmodel, HttpPostedFileBase Ico
[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>();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Data.Entity;
使用System.Web.Mvc;
使用SkyLearn.Areas.Categories.Controller;
命名空间SkyLearn.Areas.Categories.Models
{
公共类类别视图模型
{
公共列表可能值{get;set;}
公共字符串SelectedValue{get;set;}
公共子类别子类别{get;set;}
公共类别控制器类别控制器;
公共类别视图模型()
{
可能值=新列表();
}
}
}
这是我的分类和子分类:
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; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Data.Entity;
命名空间SkyLearn.Areas.Categories.Models
{
公共类类别
{
公共int ID{get;set;}
公共字符串标题{get;set;}
公共字符串图标{get;set;}
公共字符串说明{get;set;}
公共列表子类别;
公共类别()
{
子类别=新列表();
}
}
公共类CategoryDBContext:DbContext
{
公共数据库集类别{get;set;}
公共数据库集子类别{get;set;}
}
}
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Data.Entity;
使用SkyLearn.Areas.Categories.Controller;
命名空间SkyLearn.Areas.Categories.Models
{
公共类子类别
{
公共int ID{get;set;}
公共字符串标题{get;set;}
公共字符串图标{get;set;}
公共字符串说明{get;set;}
public int CategoryID{get;set;}
公共类别{get;set;}
}
公共类子类别DbContext:DbContext
{
公共数据库集子类别{get;set;}
公共数据库集类别{get;set;}
}
}
我已经在很多网站上搜索了关于这个问题的信息,但是找不到太多的帮助。有人能找出我的问题吗
如本屏幕截图所示,该对象以各种方式被正确引用。但当我下次加载数据时,对象引用已经消失。所有其他属性仍然存在,并按其应有方式保存:
谢谢阿伦尚
////更新////
我现在得到以下错误:
无法插入外键值,因为对应的主键
键值不存在。[外键约束名称]=
子类别(类别)
类别对象不会被保存,因为它未附加到添加子类别的DbContext。子类别可能知道引用,但该类别不知道。如果有一个查找表(如果是多对多,则必须有),我不知道该记录将如何保存。尝试附加类别,添加子类别,然后保存。就我个人而言,我总是将多对多查找表设置为自己的实体。与将所有控制权交给EF相比,将实际发生的事情形象化要容易一些
此外,如果您首先使用代码,请确保您的EntityConfiguration是正确的。尝试在您的上下文中运行EdmxWriter,以确保数据模型完全符合您的要求。两个对象关系是否都消失了?您似乎有一个双向关系:类别子类别。数据库表的外观如何?是的,在任何对象中都没有引用。由于我使用的是EntityFramework面向对象数据库,所以我没有亲自构造表,它会自动为我进行所有映射
子类别
也有一个类别ID
,如果是这样,如果显式设置subCategory.CategoryId=category.CategoryId
以及subCategory.category=category
,会发生什么?好的,代码优先的方法。我认为db对象是数据模型的上下文。就我所记得的,您必须在使用它的每个方法中输入using语句,并创建一个新实例。也许web应用程序保持连接打开,不保存更改,但我只是在这里猜测。当您开始使用实体时,using语句将在Create方法中开始,如下所示:using(var db=new entitiesContext()){//db maniplations here,以db.SaveChanges();}结尾。向子类别添加categoryid不会改变任何事情。对象引用是否也应该足够?我使用的是db.savechanges,当我查看一些使用该db的自动生成代码中的其他方法时,没有使用(etc)这样的东西:当我将对象附加到子类别dbcontext时,会出现以下错误:由于不存在对应的主键值,因此无法插入外键值。[外键约束名称=子类别\类别]子类别是否具有categoryId或parentId属性?确保将其设置为category.Id。我假设它的命名parentId或类似的东西-EF将无法通过约定找到FK,除非您在实体配置中映射它或专门设置它。是的,子类别对象具有CategoryID属性(int)。假设我的Subcategory DbContext应该包含一个类别对象的数据库集,并且我应该将我的类别对象附加到该上下文中,这是否正确?Subcategory DbContext肯定应该包含一个类别的数据库集-你是对的。你也发布了你的DbContext和实体配置吗?可能会有帮助