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();
}
自我回答对我来说很有用。