API接口主从表数据(Master-Detail),从表数据的两种处理方式


在 .NET API 中更新主从表(Master-Detail)的数据时,从表的数据处理方式可以有不同的实现方式,具体取决于业务需求和数据一致性的要求。通常有两种常见的处理方式:

 

1. 先删除再添加:

  • 这种方法比较简单粗暴,在更新从表数据时,先删除所有旧的从表记录,然后插入新的从表记录。
  • 优点是实现起来简单,不需要比较旧数据和新数据。
  • 缺点是可能会有性能问题(特别是当从表数据量较大时),并且可能会导致外键约束或触发器等问题。

示例代码:

C# 全选
public void UpdateMasterDetail(Master master, List<Detail> newDetails)
{
    using (var context = new MyDbContext())
    {
        // 更新主表数据
        context.Entry(master).State = EntityState.Modified;
        context.SaveChanges();

        // 删除旧的从表数据
        var oldDetails = context.Details.Where(d => d.MasterId == master.Id);
        context.Details.RemoveRange(oldDetails);
        context.SaveChanges();

        // 添加新的从表数据
        foreach (var detail in newDetails)
        {
            context.Details.Add(detail);
        }
        context.SaveChanges();
    }
}

2. 匹配现有明细进行更新、删除或新增:

  • 这种方法较为复杂,需要比较新旧数据,更新存在的记录,删除不存在的旧记录,并添加新的记录。
  • 优点是可以减少不必要的删除和添加操作,提高性能。
  • 缺点是实现较为复杂,需要处理各种数据匹配情况。

示例代码:

C# 全选
public void UpdateMasterDetail(Master master, List<Detail> newDetails)
{
    using (var context = new MyDbContext())
    {
        // 更新主表数据
        context.Entry(master).State = EntityState.Modified;
        context.SaveChanges();

        // 获取旧的从表数据
        var oldDetails = context.Details.Where(d => d.MasterId == master.Id).ToList();

        // 找出需要删除的记录
        var detailsToDelete = oldDetails.Where(od => !newDetails.Any(nd => nd.Id == od.Id)).ToList();
        context.Details.RemoveRange(detailsToDelete);

        // 找出需要更新的记录
        var detailsToUpdate = newDetails.Where(nd => oldDetails.Any(od => od.Id == nd.Id)).ToList();
        foreach (var detail in detailsToUpdate)
        {
            context.Entry(detail).State = EntityState.Modified;
        }

        // 找出需要新增的记录
        var detailsToAdd = newDetails.Where(nd => !oldDetails.Any(od => od.Id == nd.Id)).ToList();
        context.Details.AddRange(detailsToAdd);

        context.SaveChanges();
    }
}

在选择哪种方式时,主要考虑以下几点:

  • 数据量:如果从表的数据量较小,且不会对性能造成较大影响,先删除再添加的方法简单易实现。
  • 数据一致性和完整性:如果从表数据有严格的外键约束或触发器等,匹配更新的方法可以减少潜在的问题。
  • 业务需求:根据具体业务需求,选择最合适的实现方式。

总之,两种方法各有优劣,具体选择哪种方式应根据实际需求和数据特性来决定。

 

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:EF异步查询ToListAsync报错
下一篇:在 Vue 3 中,嵌套数据源且需要过滤内部数据源
评论列表

发表评论

评论内容
昵称:
关联文章

API接口主从数据(Master-Detail),数据处理方式
API接口安全设计方案
Devexpress表格GridControl主从点击获得当前选中行
EF并发处理,防止并发修改数据
SQL Server 中master..spt_values应用
JS合并个数组3方法详解
获取URL参数方式
Javascript对URL进行编码解码方式介绍
算法:计算个大量数据数组交集,差集,并集,(数据差异)
一次解决Nancy参数绑定“bug”开始发布自己第一个nuget包(上篇)
vue 路由跳转方式(带参数)
SQL Update更新数据关联
主从表演练之采购单2-个性化调整
.NET C#教程初级篇 1-1 基本数据类型及其存储方式
Devexpress GridControl明细标签控制,隐藏detail标签
ASP.NET MVC 后台控制器向View前台传递数据方式
C# 做早餐看同步异步
css颜色边框设置,边框设置多种颜色
第三方导入用户API接口
YESWEB接口日志记录

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码