.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记

简介: - 状态- 自动变更检测- 不查询删除和更新- 并发

2.4.6 EF Core -- 更新

  • 状态
  • 自动变更检测
  • 不查询删除和更新
  • 并发

状态

  • Entity State
  • Property State

Entity State

  • Added 添加
  • Unchanged 没有变化
  • Modified 已修改
  • Deleted 已删除
  • Detached 未跟踪

35.jpg

Property State

  • IsModified
  • CurrentValue
  • OriginValue

自动变更检测

  • 使用自动变更检测完成确定字段的更新
  • 使用自动变更检测完成任意字段的更新

使用自动变更检测完成确定字段的更新

ProjectController

[HttpPatch]
[Route("{id}")]
public async Task<ActionResult<Project>> SetTitleAsync(string id, [FromQuery] string title, CancellationToken cancellationToken)
{
    // 查询实体信息
    var origin = await _lighterDbContext.Projects.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);

    // 修改实体属性
    origin.Title = title;

    // 数据提交保存
    await _lighterDbContext.SaveChangesAsync();

    return origin;
}

修改分组信息

// 查询实体信息
var originGroup = await _lighterDbContext.ProjectGroups.Where(g => g.ProjectId == id).ToListAsync(cancellationToken: cancellationToken);

// 修改实体属性
foreach (var group in originGroup)
{
    group.Name = $"{title} - {group.Name}";
}

查询项目信息时带出分组信息

[HttpGet]
public async Task<IEnumerable<Project>> GetListAsync(CancellationToken cancellationToken)
{
    return await _lighterDbContext.Projects.Include(p => p.Groups).ToListAsync(cancellationToken);
}

使用自动变更检测完成任意字段的更新

[HttpPatch]
[Route("{id}")]
public async Task<ActionResult<Project>> SetAsync(string id, CancellationToken cancellationToken)
{
    // 查询实体信息
    var origin = await _lighterDbContext.Projects.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);
    var properties = _lighterDbContext.Entry(origin).Properties.ToList();

    // 修改实体属性
    foreach (var query in HttpContext.Request.Query)
    {
        var property = properties.FirstOrDefault(p => p.Metadata.Name == query.Key);
        if (property == null)
            continue;

        var currentValue = Convert.ChangeType(query.Value.First(), property.Metadata.ClrType);

        _lighterDbContext.Entry(origin).Property(query.Key).CurrentValue = currentValue;
        _lighterDbContext.Entry(origin).Property(query.Key).IsModified = true;
    }

    // 数据提交保存
    await _lighterDbContext.SaveChangesAsync(cancellationToken);

    return origin;
}

不查询删除和更新

删除之前先查询

var id = 1;
using(var db = new entityContext())
{
    var entity = db.dbset.FirstOrDefault(e=>e.ID == id);
    if(entity != null)
    {
        db.dbset.Remove(entity);
        db.SaveChanges();
    }
}

不查询删除

var id = 1;
using(var db = new entityContext())
{
    var entity = new Entity{ID = id};
    
    db.dbset.Attach(entity);
    db.dbset.Remove(entity);
    db.SaveChanges();
}

不查询更新

try
{
    using(var db = new dbContext())
    {
        var entity = new myEntity{PageID = pageid};
        db.Pages.Attach(entity);// added
        
        entity.Title = "new title";// modified, isModified=true
        entity.Url = "new-url";
        
        db.SaveChanges();
    }
}
catch(DataException)
{
    
}

并发

乐观处理:系统认为数据的更新在大多数情况下是不会产生冲突的,只在数据库更新操作提交的时候才对数据作冲突检测(推荐)

悲观处理:根据命名即对数据库进行操作更新时,对操作持悲观保守的态度,认为产生数据冲突的可能性很大,需要先对请求的数据加锁再进行相关操作

在 Entity 中添加行版本号字段

/// <summary>
/// 行版本号
/// </summary>
[Timestamp]
public byte[] RowVersion { get; set; }

每次对数据进行更新的时候,都会产生最新的版本号,如果更新的时候查询的版本号与之前的版本号不一致,就会报错

在 UpdateAsync 方法中的查询和更新中间如果数据库的行版本号发生了修改,就会报错

ProjectController

[HttpPut]
[Route("{id")]
public async Task<ActionResult<Project>> UpdateAsync(string id, [FromBody] Project project, CancellationToken cancellationToken)
{
    var origin = await _lighterDbContext.Projects.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);

    if (origin == null)
        return NotFound();

    _lighterDbContext.Entry(origin).CurrentValues.SetValues(project);

    await _lighterDbContext.SaveChangesAsync(cancellationToken);
    return origin;
}

通过客户端传入行版本号,解决前端浏览器数据覆盖问题

_lighterDbContext.Entry(origin).Property(p => p.RowVersion).OriginalValue = project.RowVersion;

2.4.7 EF Core -- 迁移

生成 SQL 脚本

从空白开始生成sql脚本  
dotnet ef migrations script


生成指定版本到最新版本的sql 
dotnet ef migrations script AddNewTables


从A-B版本生成迁移SQL脚本 
dotnet ef migrations script AddNewTables AddAuditTable

2.4.8 EF Core -- 其他

database-first

dotnet ef dbcontext scaffold "server=172.0.0.1;port=7306;user=root;password=root123456@;database=lighter" Pomelo.EntityFrameworkCore.MySql -o Models

GitHub源码链接:

https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/LighterApi

目录
相关文章
|
2月前
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
|
2月前
|
人工智能 缓存 Kubernetes
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
|
2月前
|
存储 开发框架 前端开发
前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统(LIMS)成品源码 B/S架构
发展历史:实验室信息管理系统(LIMS),就是指通过计算机网络技术对实验的各种信息进行管理的计算机软、硬件系统。也就是将计算机网络技术与现代的管理思想有机结合,利用数据处理技术、海量数据存储技术、宽带传输网络技术、自动化仪器分析技术,来对实验室的信息管理和质量控制等进行全方位管理的计算机软、硬件系统,以满足实验室管理上的各种目标(计划、控制、执行)。
45 1
|
18天前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLOv8改进 - 注意力机制】HCF-Net 之 DASI: 维度感知选择性整合模块 | 小目标
YOLO目标检测专栏介绍了HCF-Net,一种针对红外小目标检测的深度学习模型,包含PPA、DASI和MDCR模块。PPA利用多分支注意力捕获多层次特征,DASI实现自适应特征融合,MDCR通过深度可分离卷积细化空间特征。HCF-Net在SIRST数据集上的实验超越其他模型。论文和代码可在提供的链接中找到。DASI模块通过信道分区选择机制动态融合高维和低维特征。YOLOv8引入了DASI结构,结合不同尺度特征以增强小目标检测。更多配置细节参见相关链接。
|
18天前
|
机器学习/深度学习 人工智能 计算机视觉
【YOLOv8改进 - 注意力机制】HCF-Net 之 MDCR:多稀释通道细化器模块 ,以不同的稀释率捕捉各种感受野大小的空间特征 | 小目标
HCF-Net是针对红外小目标检测的深度学习模型,采用U-Net改进架构,包含PPA、DASI和MDCR模块。PPA利用多分支特征提取增强小目标表示,DASI实现自适应通道融合,MDCR通过多扩张率深度可分离卷积细化空间特征。实验显示,HCF-Net在SIRST数据集上表现出色,超越其他方法。代码和论文可在给出的链接获取。
|
1月前
|
前端开发 JavaScript 架构师
Webpack模块联邦:微前端架构的新选择
Webpack的模块联邦是Webpack 5引入的革命性特性,革新了微前端架构。它允许独立的Web应用在运行时动态共享代码,无需传统打包过程。基本概念包括容器应用(负责加载协调)和远程应用(独立应用,可暴露模块)。实现步骤涉及容器和远程应用的`ModuleFederationPlugin`配置,以及在应用间导入和使用远程模块。模块联邦的优势在于独立开发、按需加载、版本管理和易于维护。通过实战案例展示了如何构建微前端应用,包括创建容器和远程应用,以及消费远程组件。高级用法涉及动态加载、路由集成、状态管理和错误处理。
34 3
|
21天前
|
监控
交易平台---架构设计第一步拆分模块,拆分为7个模块
交易平台---架构设计第一步拆分模块,拆分为7个模块
|
1月前
|
监控 Java 关系型数据库
java版MES系统源码,后端采用 Spring Boot 多模块架构
MES系统采用Vue3的vue-element-plus-admin为后台,Spring Boot多模块架构,支持MySQL、Oracle等数据库,具备SaaS多租户功能。核心功能包括车间计划排程、工艺流程配置、生产质量管理、进度追踪、库存和排班管理等,全面覆盖生产运营关键环节。
java版MES系统源码,后端采用 Spring Boot 多模块架构
|
2月前
|
Java Linux Docker
倚天使用|YODA倚天应用迁移神器,让跨架构应用迁移变得简单高效
YODA(Yitian Optimal Development Assistant,倚天应用迁移工具)旨在帮助用户更加高效、便捷地实现跨平台、跨结构下的应用迁移,大幅度缩短客户在新平台上端到端性能验证所需的人力和时间,使得客户更加专注于应用本身算法的优化,协同客户实现降本增效。
124642 92
|
1月前
|
SQL 开发框架 .NET
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
(20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)