实体框架更新ICollection以进行自引用

时间:2016-04-25 14:59:33

标签: asp.net-mvc entity-framework

当我尝试更新数据库时,属性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; }

我用新参数调用了这个函数:

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

0 个答案:

没有答案