我有一个实体,它包含一个实体列表(与根实体相同)来表示一个文件夹结构:
public class SopFolder
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime? LastUpdated { get; set; }
public int Status { get; set; }
public virtual ICollection<SopField> SopFields { get; set; }
public virtual ICollection<SopFolder> SopFolderChildrens { get; set; }
public virtual ICollection<SopBlock> Blocks { get; set; }
public virtual ICollection<SopReview> Reviews { get; set; }
}
该实体使用运行良好的代码优先方法存储在我的数据库中。然后我将实体打印到 KendoUI Treeview,让用户对其进行修改,并在“保存”时将其发布回服务器以作为IEnumerable<TreeViewItemModel> items
.
然后,我查找 ROOT 实体及其所有子实体(只有一个根)并将其转换回 SopFolder 对象。
要在数据库中更新完整的对象,我执行以下操作:
List<SopFolder> sopfolderlist = ConvertTree(items.First());
SopFolder sopfolder = sopfolderlist[0];
if (ModelState.IsValid)
{
SopFolder startFolder = new SopFolder { Id = sopfolder.Id };
//db.SopFolders.Attach(startFolder);
// db.SopFolders.Attach(sopfolder);
startFolder.Name = sopfolder.Name;
startFolder.LastUpdated = sopfolder.LastUpdated;
startFolder.SopFields = sopfolder.SopFields;
startFolder.SopFolderChildrens = sopfolder.SopFolderChildrens;
startFolder.Status = sopfolder.Status;
db.Entry(startFolder).State = EntityState.Modified;
db.SaveChanges();
return Content("true");
}
但是,这是行不通的。模型根本没有更新。如果我在修改之前移动“entityState.Modified”,它只会在数据库中创建一个完整的新数据副本(当然是修改过的)。
我的方法是正确的还是我必须走另一条路?我在这里想念什么?我猜还有另一个“隐藏”id 可以让 EF 将实体映射到 db 条目,但我不确定这一点。感谢帮助!
更新:我也尝试过创建 SopFolder 的新实例,而不是创建一个新实例,db.SopFolders.Find(sopfolder.Id)
这适用于没有子项的条目。如果我有有孩子的实体,它会创建一个副本。
问候, 马库斯