首页 新闻 会员 周边

efcore在修改含有一对多的实体时,怎么做可以保证数据库内的数据和修改的实体数据是一致的?

0
悬赏园豆:5 [已解决问题] 解决于 2023-05-10 22:34
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);

 

 

尾随前行的主页 尾随前行 | 初学一级 | 园豆:0
提问于:2023-05-08 20:23
< >
分享
最佳答案
0

每次先获取再修改保存更好一些,这样只会更新数据发生变更的字段,详见 Change Tracking in EF Core

收获园豆:4
dudu | 高人七级 |园豆:30994 | 2023-05-09 13:28

dudu大佬, 这种情况还会引发一些问题。比如我先获取了Blog数据, 但是我在前端传来的数据中, posts不会包含已经删除了的数据,这个时候是不是只能自己去手动判断了 ? 如果只能自己手动判断的话, 就很麻烦。

尾随前行 | 园豆:0 (初学一级) | 2023-05-09 17:24

@尾随前行: 为什么要删除?不是可以直接修改吗?

dudu | 园豆:30994 (高人七级) | 2023-05-09 18:16

@dudu:  像现在做的一个仓储系统, 用户在做采购单的时候,编辑单据时,可能会删除某些商品明细,然后再加某些明细进来。 此时就涉及了在修改采购单的时候, 可能会删除、新增、修改商品明细。 我目前的u哦做做法是在修改保存前先删除所有的明细,然后再全部插入。 所以想问问有没有简答的处理方式。 

尾随前行 | 园豆:0 (初学一级) | 2023-05-09 20:29

@尾随前行: 先删除后添加还不简单吗?这已经是为了简单的偷懒做法

dudu | 园豆:30994 (高人七级) | 2023-05-10 08:28
其他回答(1)
0

当你的明细无法找到唯一值的时候,全删全加是最优解,如果全表单提交包含了ID值,可以逐个提交更新

收获园豆:1
!!!!!!!!!!!!!!! | 园豆:258 (菜鸟二级) | 2023-05-10 17:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册