Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中未正确保存对象引用_C#_Asp.net Mvc 3 - Fatal编程技术网

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

C# 实体框架中未正确保存对象引用,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,在我的控制器中,我正在创建一个子类别对象,并为该对象提供它所属类别的引用。调试站点时一切正常,但从entityframework db加载对象列表时,所有类别对象引用都会被删除。其余的问题依然存在。有人知道为什么会这样吗 控制器: [Authorize(Roles = "administrator")] [HttpPost] public ActionResult Create(CategoryViewModel viewmodel, HttpPostedFileBase Ico

在我的控制器中,我正在创建一个子类别对象,并为该对象提供它所属类别的引用。调试站点时一切正常,但从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>();
        }
    }
}
使用系统;
使用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和实体配置吗?可能会有帮助