public class Blog { public int Id { get; set; } public string Title { get; set; } public ICollection<Post> Posts { get; set; } } public class Post { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } }
实体如上,大概的操作如下
// 数据库中的数据 var blog = new Blog{ Id=1, Title="测试1", Posts=new List<Post>{ new Post{Id=1,Title="张三",Content="张三说"}, new Post{Id=2,Title="李四",Content="张三跑"}, } } //现在修改 blog= new Blog{ Id=1, Title="测试1xg", Posts=new List<Post>{ new Post{Title="张三",Content="张三说"}, new Post{Title="李四",Content="张三跑,修改不带Id,其实新增。"}, new Post{Title="新增王五",Content="张三跑哪去"}, } } dbContext.Blog.Update(blog); //此时数据库里会有5条post
//是不是这样每次修改我都必须调用一次删除再修改?还有其他便捷的方法吗?
dbContext.Post.Where(a=>a.BlogId==1).BatchDelete();//直接删除
dbContext.Blog.Update(blog);
每次先获取再修改保存更好一些,这样只会更新数据发生变更的字段,详见 Change Tracking in EF Core
dudu大佬, 这种情况还会引发一些问题。比如我先获取了Blog数据, 但是我在前端传来的数据中, posts不会包含已经删除了的数据,这个时候是不是只能自己去手动判断了 ? 如果只能自己手动判断的话, 就很麻烦。
@尾随前行: 为什么要删除?不是可以直接修改吗?
@dudu: 像现在做的一个仓储系统, 用户在做采购单的时候,编辑单据时,可能会删除某些商品明细,然后再加某些明细进来。 此时就涉及了在修改采购单的时候, 可能会删除、新增、修改商品明细。 我目前的u哦做做法是在修改保存前先删除所有的明细,然后再全部插入。 所以想问问有没有简答的处理方式。
@尾随前行: 先删除后添加还不简单吗?这已经是为了简单的偷懒做法
当你的明细无法找到唯一值的时候,全删全加是最优解,如果全表单提交包含了ID值,可以逐个提交更新