Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/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
Asp.net mvc 用于自引用的实体框架更新ICollection_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 用于自引用的实体框架更新ICollection

Asp.net mvc 用于自引用的实体框架更新ICollection,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,当我尝试更新数据库时,属性Childrens不保存,但SortOrder 和显示名称都是成功的 这是我的模型: [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Int64 Id { get; set; } public Int64? LanguageId { get; set; } [ForeignKey("LanguageId")] public

当我尝试更新数据库时,属性
Childrens
不保存,但
SortOrder
和显示名称都是成功的

这是我的模型:

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Int64 Id { get; set; }        
    public Int64? LanguageId { get; set; }
    [ForeignKey("LanguageId")]
    public Language Language { get; set; }
    public int SortOrder { get; set; }
    public string DisplayName { get; set; }

    [ForeignKey("Childrens")]
    public Int64? ParentId { get; set; }
    public ICollection<Menu> Childrens { get; set; }
[Key]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Int64 Id{get;set;}
公共Int64?LanguageId{get;set;}
[外键(“语言ID”)]
公共语言{get;set;}
公共int排序器{get;set;}
公共字符串DisplayName{get;set;}
[外国钥匙(“儿童”)]
公共Int64?ParentId{get;set;}
公共ICollection子对象{get;set;}
我使用新参数调用了此函数:

 public void SaveMenu(List<Menu> newMenu)
    {
        foreach(Menu _addMenu in newMenu)
        {
            this.Update(_addMenu);
        }
        this.Commit();
    }

 public void Update(T entity)
    {
        try
        {

            DbEntityEntry _dbEntityEntry = this.DbContext.Entry(entity);

            DbContext.Entry(entity).State = EntityState.Modified;
            if (_dbEntityEntry.State == EntityState.Detached)
                this.dbSet.Attach(entity);

            _dbEntityEntry.State = EntityState.Modified;

        }
  }
public bool Commit()
    {
        try
        {
            this.DbContext.SaveChanges();
        }
        catch (Exception ex)
        {
            return false;
        }
        return true;
    }
public void保存菜单(列表新建菜单)
{
foreach(菜单_添加新菜单中的菜单)
{
此.Update(_addMenu);
}
this.Commit();
}
公共无效更新(T实体)
{
尝试
{
DbEntityEntry _DbEntityEntry=this.DbContext.Entry(实体);
DbContext.Entry(entity.State=EntityState.Modified;
if(_dbEntityEntry.State==EntityState.Distached)
此.dbSet.Attach(实体);
_dbEntityEntry.State=EntityState.Modified;
}
}
公共boolcommit()
{
尝试
{
this.DbContext.SaveChanges();
}
捕获(例外情况除外)
{
返回false;
}
返回true;
}
孩子们不是在改变,而是在改变中获得成功

为什么会这样

编辑:

我找到了解决问题的方法,因为子对象是虚拟的,需要从数据库中获取“真实”对象

   public void SaveMenu(List<Menu> newMenu)
    {
        foreach(Menu _addMenu in newMenu)
        {
            List<Menu> listMenu = new List<Menu>();
            foreach (Menu child in _addMenu.Childrens)
            {
                Menu _menuFromDB = this.Query().FirstOrDefault(s => s.Id == child.Id);
                _menuFromDB.SortOrder = child.SortOrder;
                listMenu.Add(_menuFromDB);
            }
            _addMenu.Childrens = listMenu;
            this.Update(_addMenu,null);
        }
        this.Commit();
    }
public void保存菜单(列表新建菜单)
{
foreach(菜单_添加新菜单中的菜单)
{
列表菜单=新建列表();
foreach(在_addMenu.Childrens中的菜单子项)
{
菜单_menuFromDB=this.Query().FirstOrDefault(s=>s.Id==child.Id);
_menuFromDB.SortOrder=child.SortOrder;
listMenu.Add(_menuFromDB);
}
_addMenu.Childrens=列表菜单;
此.Update(_addMenu,null);
}
this.Commit();
}

自我回答对我来说很有用。