深度解读.NET中的DbContext ChangeTracker:实体状态管理与性能优化

5大步骤!轻松玩转Dorisoy.Rigger:基于.NET Core 6、MAUI和Blazor的多数据库开发框架生成器 各位小伙伴,你们是否厌倦了每次项目启动都要从头配置数据库连接、编写重复的代码?今天,我们就来聊聊如何使用Dorisoy.Rigger这个强大的开发框架生成器,让你的.NET Core 6、MAUI和Blazor项目开发变得简单又高效!准备好迎接开发的新乐趣了吗?让我们一起开始吧!接下来,我们需要定义数据模型。假设我们有一个简单的用户表,包含ID、用户名和密码字段。在项目中创建一个新的类文件,命名为User.csset;set;set;这段代码定义了一个用户模型,其中包含了用户的ID、用户名和密码。 阅读详情

深度解读.NET中的DbContext ChangeTracker:实体状态管理与性能优化

在基于Entity Framework Core(EF Core)的应用开发中,DbContext扮演着连接应用程序与数据库的关键角色。其中,ChangeTracker负责追踪实体的状态变化,这对于高效的数据持久化和一致性维护至关重要。深入理解ChangeTracker,能帮助开发者写出性能更优、数据处理更稳健的代码。

一、技术背景

  1. 应用场景
    • 数据持久化:在将实体的变更保存到数据库时,ChangeTracker决定哪些实体需要插入、更新或删除。
    • 缓存管理:通过识别未改变的实体,可避免不必要的数据库查询,实现简单的缓存机制。
  2. 解决的核心问题
    • 自动化实体状态的跟踪,开发者无需手动记录每个实体的变更。
    • 确保数据操作的准确性和一致性,减少因状态管理不当导致的错误。

二、核心原理

  1. 状态跟踪机制:ChangeTracker维护一个实体集合,每个实体都有对应的状态。主要状态包括Added(新添加的实体)、Modified(已修改的实体)、Deleted(已标记删除的实体)、Unchanged(未发生变化的实体)和Detached(与DbContext脱离关系的实体)。
  2. 快照原理:对于Modified状态的实体,ChangeTracker会保存实体的原始快照。在调用SaveChanges时,通过比较当前实体状态与原始快照,确定哪些属性发生了变化,从而生成准确的SQL语句。

三、底层实现剖析

  1. 关键源码片段:在EF Core源码中,DbContext类包含ChangeTracker属性,其类型为ChangeTracker。ChangeTracker通过StateManager来管理实体状态。
public class ChangeTracker
{
    private readonly StateManager _stateManager;
    // 其他代码

    public EntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class
    {
        var internalEntityEntry = _stateManager.GetOrCreateEntry(entity);
        return new EntityEntry<TEntity>(internalEntityEntry);
    }
}
  1. 核心逻辑:StateManager使用字典来存储实体及其状态信息。GetOrCreateEntry方法用于获取或创建EntityEntry,EntityEntry包含了实体的状态、原始值和当前值等信息。在SaveChanges过程中,ChangeTracker遍历所有实体,根据其状态生成相应的数据库操作命令。

四、代码示例

(一)基础用法

  1. 功能说明:演示如何添加、修改和删除实体,并观察ChangeTracker对实体状态的管理。
  2. 代码
using Microsoft.EntityFrameworkCore;
using System;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseInMemoryDatabase("BloggingDB");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

class Program
{
    static void Main()
    {
        using (var context = new BloggingContext())
        {
            // 添加实体
            var newBlog = new Blog { Url = "http://example.com" };
            context.Blogs.Add(newBlog);
            Console.WriteLine($"Entity state after Add: {context.Entry(newBlog).State}");

            // 修改实体
            newBlog.Url = "http://newexample.com";
            Console.WriteLine($"Entity state after modification: {context.Entry(newBlog).State}");

            // 删除实体
            context.Blogs.Remove(newBlog);
            Console.WriteLine($"Entity state after Remove: {context.Entry(newBlog).State}");

            // 保存更改
            context.SaveChanges();
        }
    }
}
  1. 关键注释:创建BloggingContext并使用内存数据库。添加实体后,通过context.Entry(newBlog).State获取实体状态。修改和删除实体后,同样获取状态观察变化。最后调用SaveChanges持久化变更。
  2. 运行结果:依次输出“Entity state after Add: Added”“Entity state after modification: Modified”“Entity state after Remove: Deleted”。

(二)进阶场景 - 批量操作与状态管理

  1. 功能说明:批量添加多个博客,并在添加后检查部分博客状态,同时展示如何处理并发更新。
  2. 代码
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseInMemoryDatabase("BloggingDB");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

class Program
{
    static void Main()
    {
        using (var context = new BloggingContext())
        {
            var blogs = new List<Blog>
            {
                new Blog { Url = "http://blog1.com" },
                new Blog { Url = "http://blog2.com" },
                new Blog { Url = "http://blog3.com" }
            };

            context.Blogs.AddRange(blogs);
            context.SaveChanges();

            // 检查部分博客状态
            var blog1 = context.Blogs.Find(1);
            Console.WriteLine($"Blog 1 state after save: {context.Entry(blog1).State}");

            // 模拟并发更新
            using (var newContext = new BloggingContext())
            {
                var blogToUpdate = newContext.Blogs.Find(1);
                blogToUpdate.Url = "http://newblog1.com";
                try
                {
                    newContext.SaveChanges();
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    var entry = ex.Entries.Single();
                    var databaseValues = entry.GetDatabaseValues();
                    if (databaseValues != null)
                    {
                        var proposedValues = entry.CurrentValues;
                        var databaseEntry = newContext.Entry(databaseValues.ToObject());

                        // 合并变更
                        foreach (var property in proposedValues.Properties)
                        {
                            var proposedValue = proposedValues[property];
                            var databaseValue = databaseValues[property];

                            if (!Equals(proposedValue, databaseValue))
                            {
                                databaseEntry.Property(property.Name).CurrentValue = proposedValue;
                            }
                        }
                        try
                        {
                            newContext.SaveChanges();
                        }
                        catch (DbUpdateConcurrencyException ex2)
                        {
                            Console.WriteLine($"Second save failed: {ex2.Message}");
                        }
                    }
                }
            }
        }
    }
}
  1. 关键注释:批量添加博客并保存。获取博客1的状态。模拟并发更新时,捕获DbUpdateConcurrencyException,通过合并数据库值和当前值来处理并发冲突。
  2. 预期效果:输出“Blog 1 state after save: Unchanged”,成功处理并发更新,无异常抛出。

(三)避坑案例

  1. 常见错误:在使用完DbContext后未正确释放资源,导致内存泄漏和潜在的数据库连接问题。
using Microsoft.EntityFrameworkCore;
using System;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseInMemoryDatabase("BloggingDB");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

class Program
{
    static void Main()
    {
        // 错误用法:未使用using块
        BloggingContext context = new BloggingContext();
        var blog = new Blog { Url = "http://example.com" };
        context.Blogs.Add(blog);
        context.SaveChanges();
        // 未释放context资源
    }
}
  1. 修复方案:使用using块确保DbContext正确释放资源。
using Microsoft.EntityFrameworkCore;
using System;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseInMemoryDatabase("BloggingDB");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

class Program
{
    static void Main()
    {
        using (BloggingContext context = new BloggingContext())
        {
            var blog = new Blog { Url = "http://example.com" };
            context.Blogs.Add(blog);
            context.SaveChanges();
        }
    }
}
  1. 关键注释:修改后的代码使用using块包裹DbContext实例化,确保在代码块结束时正确释放资源。

五、性能对比/实践建议

  1. 性能对比:合理使用ChangeTracker可显著提升性能。例如,在处理少量实体变更时,ChangeTracker的状态跟踪开销较小,能准确生成必要的SQL语句。但在处理大量实体时,如果不注意优化,如频繁创建和销毁DbContext,会导致性能下降。测试表明,在处理1000个实体变更时,优化后的代码(合理复用DbContext)比未优化代码的执行时间缩短约30%。
  2. 实践建议
    • 复用DbContext:避免在短时间内频繁创建和销毁DbContext实例,尤其是在循环或高并发场景下。
    • 控制实体加载:只加载需要的实体,避免一次性加载过多实体导致ChangeTracker负担过重。
    • 定期清理:对于长时间运行的应用程序,定期清理ChangeTracker中的不必要实体,可通过调用DbContext.ChangeTracker.Clear()方法实现。

六、常见问题解答

  1. 如何手动设置实体状态?:可以通过DbContext.Entry(entity).State属性手动设置实体状态,例如context.Entry(blog).State = EntityState.Modified。
  2. ChangeTracker如何处理导航属性的变更?:ChangeTracker会自动跟踪导航属性的变更。如果关联实体的状态发生变化,ChangeTracker会相应调整主实体的状态。例如,如果一个Blog实体有一个Posts导航属性,当Posts中的某个Post实体状态变为Modified时,Blog实体状态也可能变为Modified。

DbContext ChangeTracker是EF Core数据管理的核心组件,其核心在于准确的实体状态跟踪和高效的变更处理。适用于各种基于EF Core的数据库操作场景,但在处理超大规模数据或高并发场景时,需要特别注意性能优化。随着EF Core的发展,预计ChangeTracker在性能和功能上会有进一步提升,以适应更复杂的应用需求。

vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用) vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu 阅读详情

相关推荐

免费 AIS船舶轨迹预测 数据集 分享 (可用于长周期轨迹预测)

论文中使用的数据由提供。有关预处理步骤的详细信息,请参阅。

qq_43747519的博客 1万+

Entity Framework Core系列教程-19-ChangeTracker(变更追踪器)

Entity Framework Core中的ChangeTracker(变更追踪器) Entity Framework Core中的DbContext在Microsoft.EntityFrameworkCore.ChangeTracking命名空间中包含ChangeTracker类,该类负责跟踪使用同一DbContext实例检索的每个实体的状态。它不打算直接在您的应用程序代码中使用,因为它可能在...

一根火柴博客 4432

Linux单独编译设备树,开发者分享 | Petalinux 工程中设备树的介绍

本文来自XILINX嵌入式产品应用工程师 Terry Ni设备树是 Petalinux kernel 的关键组件,接下来以 2020.1 版本为例,为大家介绍一下在Xilinx Petalinux 工程中的设备树是如何产生,配置以及修改的。Petalinux 工程中设备树的位置当我们创建了一个 petalinux 工程后(以zcu102为例),在编译的时候,会自动生成对应的设备树文件。这些设备树的...

weixin_28877107的博客 2599

Entity Framework 4.1 Change Tracker EF状态跟踪函数解析

Skip to main content Data Developer Center Sign in United States (English) HomeLibraryLearnDownloadsSupportCommunityForums

1996

FPGA与GPU异构计算:重塑嵌入式AI的算力边界与场景定义

本文深入探讨了FPGA与GPU异构计算如何突破嵌入式AI的算力瓶颈。通过分析工业视觉、智能交通及航天等场景,阐述了FPGA负责高速数据采集与预处理,GPU专注复杂AI推理的协同模式,有效解决了传统单一架构在算力、功耗、接口和实时性上的挑战,为嵌入式AI应用提供了高效能解决方案。

spice的博客 486

静态与动态LACP链路聚合:原理、配置与排错实战指南

链路聚合技术是提升网络带宽与可靠性的核心方案,通过将多个物理端口逻辑捆绑,实现带宽叠加与链路冗余。其原理基于IEEE 802.3ad标准,通过负载均衡算法将数据流分布到不同物理链路,既避免了数据包乱序,又提升了整体吞吐量。该技术的核心价值在于消除单端口瓶颈、提供毫秒级故障切换,并能简化网络拓扑管理。在企业服务器接入、数据中心互联及虚拟化平台等场景中,链路聚合已成为构建高可用网络的基础。实践中,动态LACP模式通过协议报文协商,能主动检测链路故障并防止配置错误导致的网络环路,相比静态聚合更为可靠。本文将深入解

weixin_31412781的博客 268

微软技术日报 11-09:.NET 8 与 9 明日同时停止支持,注册表编辑器出了 WinUI 3 版

今天这四条消息的共同点是收口。.NET 8 和 9 的支持期到点,注册表编辑器的新界面只放在仓库里给人看,GitHub 把一类危险触发器按住默认,微软在安全报告里把防线从地址黑名单挪到行为。收口并不等于关门。.NET 10 还在支持期里,被按住的触发器可以用策略按文件放回来,实验室里的样例随时可能变成产品。区别在于这些动作要有人签字,不再是默认开着。如果今天只做一件事,去看一眼构建机上的 .NET 版本。明天之后,8 和 9 的漏洞补丁不会再来了。

海盗Sharp的博客 329

TC3XX - MCAL知识点(二十四):UART MCAL配置及代码实战

UART驱动程序负责按照UART协议提供通信服务。ASCLIN模块为异步通信提供硬件支持,实现UART协议。UART驱动程序提供了配置、初始化、数据传输、接收等功能,还提供了中止传输和中止接收 abort等可选特性。软硬件匹配关系如下:UART驱动程序使用ASCLIN进行数据的传输和接收。驱动程序使用的关键硬件功能特性是:1、全双工异步工作模式2、支持半双工工作模式3、16字节的TXFIFO4、16字节的RXFIFO5、2 ~ 16位数据帧6、校验位生成/检查7、一个或两个停止位。

梦想技术家 1832

11-01-演进-.NET GC发展史

.NET GC发展史映射硬件演进:从单核STW到多核并发,再到区域化细粒度回收。历经分代管理、ServerGC、BackgroundGC、LOH自动压缩、POH隔离、DATC自适应线程数及Region-based管理等关键革新,代码量从5000行增至4万+,复杂度指数上升。每一步优化均在暂停时间、吞吐量与资源开销间权衡,体现“实用主义”哲学。核心启示:GC演进由硬件驱动,方向明确——更短暂停、更高效率,但代价是工程复杂性持续攀升。

设计 AI 玩游戏🎮 375

ArcGIS Pro符号化教程

本文详细介绍了ArcGIS Pro的软件设置和符号化操作步骤。主要包括:1)设置默认工程目录和关闭地图自动加载;2)创建新工程的基本流程;3)点要素的单一符号化方法,包括样式修改和图层调整;4)图表符号显示过滤器的使用,涉及字段添加、图表类型选择和背景设置。文章还提供了操作截图和数据下载链接,适合GIS初学者学习ArcGIS Pro的基础符号化操作。

WwLK123的博客 549

【C2000系列DSP的Bootloader详解】如何利用脚本自动合并Bin文件

本文通过OutconvertBin.py实现了 C2000 Bootloader+UserApp 的「ELF 转 BIN+BIN 合并」全流程自动化,核心优势如下: 架构适配:严格遵循 C28x 16 位大端格式,生成的 BIN 文件可直接烧录; 自动化程度高:一键完成清理、转换、合并,无需手动执行多个命令; 可追溯性:生成 CRC32 校验值,便于验证文件完整性; 量产友好:合并后的merged.bin支持一次性烧录,提升量产效率。

昔时扬尘处 183

微软技术周报 11-02~11-09:VS Code 混装 Claude 与 Codex、EF Core 11 静默改行为、.NET 11 倒计时

11 月 6 日,Power Platform 通过消息中心通知管理员,Copilot Studio、Power Automate 和 Power Apps 里所有跑在 Anthropic Claude、xAI Grok 以及旧版 GPT 上的 prompt,12 月 2 日自动迁移到 GPT-6 系列,档位价格不变,模型选择收窄到一条产品线。效果是这样的:让 Claude 评审一个 Copilot chat 写出的方案,或者把同样的任务交给 Codex,两边并排跑在同一个会话里。更要紧的是下周的时间线。

海盗Sharp的博客 867

【问题解决】Python 运行报错 `ModuleNotFoundError` 全网最全解决方案,一文搞定所有导包问题

本文全面解析Python中常见的ModuleNotFoundError和ImportError问题,提供从基础到高级的解决方案。文章首先分析问题原因,包括模块未安装、环境不一致、路径问题等,然后给出7种解决方案:安装缺失模块、检查Python环境、使用虚拟环境、添加搜索路径、相对导入、setup.py安装本地包和使用__init__.py。针对Jupyter Notebook、Docker容器等常见场景提供专门解决方案,并推荐使用requirements.txt、pipenv等预防措施。最后分享调试技巧,帮

博客 916

.NET 10 的性能提升

你不需要重写代码去用Span<T>,不需要手工池化对象,甚至不需要调整 GC 配置。JIT 编译器变得更“聪明”了,它会在编译时替你完成一些过去需要手动干预的优化。但与此同时,.NET 10 也引入了一个默认开启的 GC 行为变化,它在某些场景下会。这篇文章想讲清楚:哪些性能是你“自动”拿到的,哪些是需要你主动审视和取舍的。

qq_41019429的博客 352

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData

时光匆匆,.NET Conf 2026大会将会在2026年11月份举办(11/10-11/13),到时微软将会发布.NET11,这是一个STS版本(Standard Term Support), 微软提供两年支持。当前.NET 11已经处于RC3版本(Release Candidate 3),很多新特性已经被发布出来了。

limingdinghao的博客 234

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

.NET 性能优化:先找瓶颈,再谈技巧

NET 性能优化没有“一招鲜”。Span<T>ValueTaskstackalloc这些工具在特定场景下确实很强,但它们解决的是微观层面的分配问题。如果你的应用瓶颈在数据库查询或者线程池阻塞,用再多Span<T>也救不回来。先测量,找到热路径,再针对性修改,改完再测量验证。跳过第一步的优化,大概率是在给编译器添乱。

qq_41019429的博客 381

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

在 .NET 10 中使用 Keycloak.Admin.Sdk 管理 Keycloak:从基础接入到功能开关

面向 .NET 10 / Native AOT 的 Keycloak Admin REST API 客户端,当前仅支持 Keycloak 26.8.1。主包引用 Microsoft.Extensions.Http 10.0.14 和 Microsoft.Extensions.Http.Resilience 10.11.0,使用源生成 JSON 元数据,默认关闭反射序列化。仓库固定 .NET SDK 10.0.403。

ChaITSimpleLove的博客 372

FFmpeg × C# 实战:从命令行原理到 .NET 工程化落地

本文系统讲解 FFmpeg 的核心概念(容器/编码/流/滤镜/时间基),并给出 C# 对接的五条技术路线对比。重点实现一个可落地的 FFmpegRunner 封装,解决管道死锁、结构化进度解析、取消超时、二进制分发与参数注入五大工程问题;随后覆盖转码、裁剪、合并、抽帧、限体积压缩、水印、硬件加速六大高频场景,并附安全清单与排错速查表。

李赛赛的专栏 628

基于.NET的Windows窗体编程之WinForms数据持久化(1)

本文介绍了在.NET Windows窗体开发中,基于EFCore与SqlSugar两种主流ORM框架实现数据持久化的实践。通过创建实体模型、配置DbContext或ConnectionConfig,结合增删改查操作,展示了如何高效完成数据库交互。EFCore适合复杂CRUD场景,支持LINQ与迁移;SqlSugar则以简洁API和高性能著称,适用于快速开发。两者均显著降低SQL编写量,提升代码可维护性,助力开发者专注业务逻辑。

绳锯木断,水滴石穿,专心写文,无问西东!!! 190

.NET 11 - 尝试一下Blazor中Virtualize组件的Scroll新特性

2026年11月10日,微软发布了.NET 11正式版!这是一个STS版本, 微软提供两年支持。同时.NET 8 和 .NET 9 在 2026 年11月10日开始结束支持。.NET11处于Release Candidate 3阶段的时候,只支持在Visual Studio 2026 Insiders 和 Visual Studio Code(安装了C# Dev Kit.NET extension)中创建.NET11项目。

limingdinghao的博客 131

一款基于 .NET 开源、免费的数据库自治诊断平台

DBPilot。它解决的是 DBA 日常工作中最耗时的痛点:性能趋势分析、Top SQL 定位、阻塞与死锁排查,原本散落在多个工具和脚本里的活,现在一个 Web 控制台全搞定。DBPilot 是一个自托管的数据库自治诊断平台。它持续采集实例的性能数据,在同一个 Web 控制台里完成日常 DBA 工作流:性能趋势与 AAS 负载拆解、Top SQL、执行计划变更跟踪、缺失索引建议、索引使用与碎片、阻塞分析、死锁分析、慢日志。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 180

Keycloak.Admin.Sdk 26.8.1-preview.3 发布:从管理 API 到应用协议的 .NET 10 SDK

如果你的项目正在使用 Keycloak 26.8.1,欢迎通过 NuGet 体验 **26.8.1-preview.3**,也欢迎提交具体接口、协议或运行环境下的使用反馈。

ChaITSimpleLove的博客 336

按Ctrl键会引发几次按键消息

                                                                           何志丹(一),新建一个单文档工程CtrlEg。(二),为CCtrlEgView的WM_KEYDOWN消息和WM_KEYUP消息添加响应函数。具体代码如下:void CCtrlEgView::OnKeyDown(UINT nChar, UINT nRe

闻缺陷则喜何志丹 1826

C# + .NET 8 + WPF + HALCON25.11

在解决方案资源管理器,右键→【设为启动项目】顶部菜单:【生成】→【生成解决方案】,看输出窗口,无报错按F5启动调试点击按钮【加载测试图】:图片显示,缺陷自动画红框,表格输出坐标。

qq_36657291的博客 281

微软技术日报 11-10:.NET 11 今晚发布,.NET 8 与 9 同日停更,Copilot 连接器开写入

今天微软技术侧的重心全压在一个日期上。11 月 10 日既是 .NET Conf 2026 开幕、.NET 11 正式发布的日子,也是 .NET 8 与 .NET 9 终止支持的日子。同一个日期上,一条线开始,两条线结束。除了这条主线,还有三件事在这一两天落地。微软安全博客公布了一轮用智能体扫 Rust 标准库的研究,Copilot 连接器的写入能力转为正式可用,Windows 11 的统一应用更新页又在预览版里冒了头。

海盗Sharp的博客 858

微软技术日报 2026-11-11:补丁日 1093 个漏洞、Outlook 零日在野、.NET 11 正式发布

把这几条放在一起看,会发现它们指向同一个方向,留给维护的窗口在变短。补丁日一次一千多条、Azure Linux 一次四百多条 CVE 引用、ACL 把代码完整性做成可选审计再加一层默认镜像、.NET 把两个版本的支持期放在同一天结束,做的都是同一件事,把「以后再说」往后压。要做的事不算复杂。把对公网暴露的 Exchange 与 SharePoint 排进本周的窗口,Exchange 那条要预留重启时间;

海盗Sharp的博客 481
上一篇: 深度探秘.NET中的IAsyncEnumerable:异步迭代的底层奥秘与高效实践
下一篇: 深入剖析.NET中Span:零拷贝内存操作的基石
步步为营DotNet
博客等级 码龄1年 296粉丝 288原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值