第二單元 EFCore 入門

来源:https://www.cnblogs.com/xuyubing/archive/2023/12/11/17894522.html
-Advertisement-
Play Games

1. 快速入門 創建新的控制台項目 dotnet new console -o EFGetStarted cd EFGetStarted 安裝 Entity Framework Core 要安裝 EF Core,請為要作為目標對象的 EF Core 資料庫提供程式安裝程式包。 本教程使用 SQLit ...


1. 快速入門

創建新的控制台項目

dotnet new console -o EFGetStarted
cd EFGetStarted

 

安裝 Entity Framework Core

要安裝 EF Core,請為要作為目標對象的 EF Core 資料庫提供程式安裝程式包。 本教程使用 SQLite 的原因是,它可在 .NET Core 支持的所有平臺上運行 。

dotnet add package Microsoft.EntityFrameworkCore.Sqlite

 

 

創建模型

定義構成模型的上下文類和實體類。

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
​
public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
​
    public string DbPath { get; }
​
    public BloggingContext()
    {
        var folder = Environment.SpecialFolder.LocalApplicationData;
        var path = Environment.GetFolderPath(folder);
        DbPath = System.IO.Path.Join(path, "blogging.db");
    }
​
    // 配置SQLLite連接字元串(其實就是提供一個本地文件夾用於放數據而已)
    protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlite($"Data Source={DbPath}");
}
​
public class Blog
{
    public int BlogId { get; set; }
    public string? Url { get; set; }
​
    public List<Post> Posts { get; } = new();
}
​
public class Post
{
    public int PostId { get; set; }
    public string? Title { get; set; }
    public string? Content { get; set; }
​
    public int BlogId { get; set; }
    public Blog? Blog { get; set; }
}
 

 

創建資料庫

dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.4
dotnet ef migrations add InitialCreate
dotnet ef database update

 

這會安裝 dotnet ef 和設計包,這是對項目運行命令所必需的。 migrations 命令為遷移搭建基架,以便為模型創建一組初始表。 database update 命令創建資料庫並向其應用新的遷移。

 

CURD

打開 Program.cs 並將內容替換為以下代碼

using System;
using System.Linq;

using var db = new BloggingContext();

Console.WriteLine($"Database path: {db.DbPath}.");

// 新增
Console.WriteLine("新增了一條blog");
db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
db.SaveChanges();

// 讀取
Console.WriteLine("查詢一條blog");
var blog = db.Blogs
    .OrderBy(b => b.BlogId)
    .First();

// 更新
Console.WriteLine("更新 blog 並且 添加一條 post數據");
blog.Url = "https://devblogs.microsoft.com/dotnet";
blog.Posts.Add(
    new Post { Title = "Hello World", Content = "I wrote an app using EF Core!" });
db.SaveChanges();

// 刪除
Console.WriteLine("刪除 blog");
db.Remove(blog);
db.SaveChanges();

// 釋放資源
db.Dispose();
 

 

運行:

dotnet run

 

 

2. 資料庫上下文

1. DbContext 生命周期

DbContext 的生命周期從創建實例時開始,併在釋放實例時結束。 DbContext 實例旨在用於單個工作單元。 這意味著 DbContext 實例的生命周期通常很短。

提示

引用上述鏈接中 Martin Fowler 的話,“工作單元將持續跟蹤在可能影響資料庫的業務事務中執行的所有操作。 當你完成操作後,它將找出更改資料庫作為工作結果時需要執行的所有操作。”

使用 Entity Framework Core (EF Core) 時的典型工作單元包括:

  • 創建 DbContext 實例

  • 根據上下文跟蹤實體實例。 實體將在以下情況下被跟蹤

  • 根據需要對所跟蹤的實體進行更改以實現業務規則

  • 調用 SaveChangesSaveChangesAsync。 EF Core 檢測所做的更改,並將這些更改寫入資料庫。

  • 釋放 DbContext 實例

重要

  • 使用後釋放 DbContext 非常重要。 這可確保釋放所有非托管資源,並註銷任何事件或其他掛鉤,以防止在實例保持引用時出現記憶體泄漏。

  • DbContext 不是線程安全的。 不要線上程之間共用上下文。 請確保在繼續使用上下文實例之前,等待所有非同步調用。

  • EF Core 代碼引發的 InvalidOperationException 可以使上下文進入不可恢復的狀態。 此類異常指示程式錯誤,並且不旨在從其中恢復。

2. ASP.NET Core 註入中的 DbContext

在許多 Web 應用程式中,每個 HTTP 請求都對應於單個工作單元。 這使得上下文生存期與請求的生存期相關,成為 Web 應用程式的一個良好預設值。

使用依賴關係註入配置 ASP.NET Core 應用程式。 可以使用 Startup.csConfigureServices 方法中的 AddDbContext 將 EF Core 添加到此配置。 例如:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddDbContext<ApplicationDbContext>(
        options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));
}

 

此示例將名為 ApplicationDbContextDbContext 子類註冊為 ASP.NET Core 應用程式服務提供程式(也稱為依賴關係註入容器)中的作用域服務。 上下文配置為使用 SQL Server 資料庫提供程式,並將從 ASP.NET Core 配置讀取連接字元串。 在 ConfigureServices 中的何處調用 AddDbContext 通常不重要。

ApplicationDbContext 類必須公開具有 DbContextOptions<ApplicationDbContext> 參數的公共構造函數。 這是將 AddDbContext 的上下文配置傳遞到 DbContext 的方式。 例如:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

 

然後,ApplicationDbContext 可以通過構造函數註入在 ASP.NET Core 控制器或其他服務中使用。 例如:

public class MyController
{
    private readonly ApplicationDbContext _context;

    public MyController(ApplicationDbContext context)
    {
        _context = context;
    }
}

 

最終結果是為每個請求創建一個 ApplicationDbContext 實例,並傳遞給控制器,並且在請求結束後釋放DbContext

有關配置選項的詳細信息,請進一步閱讀本文。 此外,有關 ASP.NET Core 中的配置和依賴關係註入的詳細信息,請參閱 ASP.NET Core 中的應用啟動ASP.NET Core 中的依賴關係註入

 

3. “new”一個 DbContext

可以按照常規的 .NET 方式構造 DbContext 實例,例如,使用 C# 中的 new。 可以通過重寫 OnConfiguring 方法或通過將選項傳遞給構造函數來執行配置。 例如:

public class ApplicationDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test");
    }
}

 

通過此模式,還可以輕鬆地通過 DbContext 構造函數傳遞配置(如連接字元串)。 例如:

public class ApplicationDbContext : DbContext
{
    private readonly string _connectionString;

    public ApplicationDbContext(string connectionString)
    {
        _connectionString = connectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_connectionString);
    }
}

 

或者,可以使用 DbContextOptionsBuilder 創建 DbContextOptions 對象,然後將該對象傳遞到 DbContext 構造函數。 這使得為依賴關係註入配置的 DbContext 也能顯式構造。 例如,使用上述為 ASP.NET Core 的 Web 應用定義的 ApplicationDbContext 時:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}
可以創建 DbContextOptions,並可以顯式調用構造函數:

var contextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test")
    .Options;

using var context = new ApplicationDbContext(contextOptions);

 

4. DbContext 工廠

某些應用程式類型(例如 ASP.NET Core Blazor)使用依賴關係註入,但不創建與所需的 DbContext 生存期一致的服務作用域。 即使存在這樣的對齊方式,應用程式也可能需要在此作用域內執行多個工作單元。 例如,單個 HTTP 請求中的多個工作單元。

在這些情況下,可以使用 AddDbContextFactory 來註冊工廠以創建 DbContext 實例。 例如:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContextFactory<ApplicationDbContext>(
        options =>
            options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test"));
}

 

ApplicationDbContext 類必須公開具有 DbContextOptions<ApplicationDbContext> 參數的公共構造函數。 此模式與上面傳統 ASP.NET Core 部分中使用的模式相同。

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

 

然後,可以通過構造函數註入在其他服務中使用 DbContextFactory 工廠。 例如:

private readonly IDbContextFactory<ApplicationDbContext> _contextFactory;

public MyController(IDbContextFactory<ApplicationDbContext> contextFactory)
{
    _contextFactory = contextFactory;
}

 

然後,可以使用註入的工廠在服務代碼中構造 DbContext 實例。 例如:

public void DoSomething()
{
    using (var context = _contextFactory.CreateDbContext())
    {
        // ...
    }
}

 

請註意,以這種方式創建的 DbContext 實例並非由應用程式的服務提供程式進行管理,因此必須由應用程式釋放。

 

5. 配置資料庫提供程式

每個 DbContext 實例都必須配置為使用一個且僅一個資料庫提供程式。 (DbContext 子類型的不同實例可用於不同的資料庫提供程式,但一個實例只能使用一個。)一個資料庫提供程式要使用一個特定的 Use* 調用進行配置。 例如,若要使用 SQL Server 資料庫提供程式:

public class ApplicationDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test");
    }
}

 

這些 Use* 方法是由資料庫提供程式實現的擴展方法。 這意味著必須先安裝資料庫提供程式 NuGet 包,然後才能使用擴展方法。

提示

EF Core 資料庫提供程式廣泛使用擴展方法。 如果編譯器指示找不到方法,請確保已安裝提供程式的 NuGet 包,並且你在代碼中已有 using Microsoft.EntityFrameworkCore;

下表包含常見資料庫提供程式的示例。

資料庫系統配置示例NuGet 程式包
SQL Server 或 Azure SQL .UseSqlServer(connectionString) Microsoft.EntityFrameworkCore.SqlServer
Azure Cosmos DB .UseCosmos(connectionString, databaseName) Microsoft.EntityFrameworkCore.Cosmos
SQLite .UseSqlite(connectionString) Microsoft.EntityFrameworkCore.Sqlite
EF Core 記憶體中資料庫 .UseInMemoryDatabase(databaseName) Microsoft.EntityFrameworkCore.InMemory
PostgreSQL* .UseNpgsql(connectionString) Npgsql.EntityFrameworkCore.PostgreSQL
MySQL/MariaDB* .UseMySql(connectionString) Pomelo.EntityFrameworkCore.MySql
Oracle* .UseOracle(connectionString) Oracle.EntityFrameworkCore

 

警告

EF Core 記憶體中資料庫不是為生產用途設計的。 此外,它可能不是測試的最佳選擇。 有關詳細信息,請參閱使用 EF Core 的測試代碼

 

特定於資料庫提供程式的可選配置是在其他特定於提供程式的生成器中執行的。 例如,在連接到 Azure SQL 時,使用 EnableRetryOnFailure 為連接複原配置重試:

public class ApplicationDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder
            .UseSqlServer(
                @"Server=(localdb)\mssqllocaldb;Database=Test",
                providerOptions => { providerOptions.EnableRetryOnFailure(); });
    }
}

 

提示

同一資料庫提供程式用於 SQL Server 和 Azure SQL。 但是,建議在連接到 SQL Azure 時使用連接複原

 

6. 其他 DbContext 配置

其他 DbContext 配置可以鏈接到 Use* 調用之前或之後(這不會有任何差別)。 例如,若要啟用敏感數據日誌記錄:

public class ApplicationDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder
            .EnableSensitiveDataLogging()
            .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test");
    }
}

 

下表包含 DbContextOptionsBuilder 調用的常見方法的示例。

DbContextOptionsBuilder 方法作用瞭解更多
UseQueryTrackingBehavior 設置查詢的預設跟蹤行為 查詢跟蹤行為
LogTo 獲取 EF Core 日誌的一種簡單方法(EF Core 5.0 及更高版本) 日誌記錄、事件和診斷
UseLoggerFactory 註冊 Microsoft.Extensions.Logging 工廠 日誌記錄、事件和診斷
EnableSensitiveDataLogging 在異常和日誌記錄中包括應用程式數據 日誌記錄、事件和診斷
EnableDetailedErrors 更詳細的查詢錯誤(以性能為代價) 日誌記錄、事件和診斷
ConfigureWarnings 忽略或引發警告和其他事件 日誌記錄、事件和診斷
AddInterceptors 註冊 EF Core 偵聽器 日誌記錄、事件和診斷
UseLazyLoadingProxies 使用動態代理進行延遲載入 延遲載入
UseChangeTrackingProxies 使用動態代理進行更改跟蹤 即將推出...

 

7. DbContextOptionsDbContextOptions<TContext>

大多數接受 DbContextOptionsDbContext 子類應使用 泛型DbContextOptionsTContext>變體。 例如:

public sealed class SealedApplicationDbContext : DbContext
{
    public SealedApplicationDbContext(DbContextOptions<SealedApplicationDbContext> contextOptions)
        : base(contextOptions)
    {
    }
}

 

這可確保從依賴關係註入中解析特定 DbContext 子類型的正確選項,即使註冊了多個 DbContext 子類型也是如此。

提示

你的 DbContext 不需要密封,但對於沒有被設計為繼承的類,密封是最佳做法。

但是,如果 DbContext 子類型本身旨在繼承,則它應公開采用非泛型 DbContextOptions 的受保護構造函數。 例如:

public abstract class ApplicationDbContextBase : DbContext
{
    protected ApplicationDbContextBase(DbContextOptions contextOptions)
        : base(contextOptions)
    {
    }
}

 

這允許多個具體子類使用其不同的泛型 DbContextOptions<TContext> 實例來調用此基構造函數。 例如:

public sealed class ApplicationDbContext1 : ApplicationDbContextBase
{
    public ApplicationDbContext1(DbContextOptions<ApplicationDbContext1> contextOptions)
        : base(contextOptions)
    {
    }
}

public sealed class ApplicationDbContext2 : ApplicationDbContextBase
{
    public ApplicationDbContext2(DbContextOptions<ApplicationDbContext2> contextOptions)
        : base(contextOptions)
    {
    }
}

 

請註意,這與直接從 DbContext 繼承的模式完全相同。 也就是說,出於此原因,DbContext 構造函數本身將接受非泛型 DbContextOptions

旨在同時進行實例化和繼承的 DbContext 子類應公開構造函數的兩種形式。 例如:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> contextOptions)
        : base(contextOptions)
    {
    }

    protected ApplicationDbContext(DbContextOptions contextOptions)
        : base(contextOptions)
    {
    }
}

 

8. 避免 DbContext 線程處理問題

Entity Framework Core 不支持在同一 DbContext 實例上運行多個並行操作。 這包括非同步查詢的並行執行以及從多個線程進行的任何顯式併發使用。 在這個上下文,使用 await 來確保所有的非同步操作完成於另一個方法調用之前。

當 EF Core 檢測到嘗試同時使用 DbContext 實例的情況時,你將看到 InvalidOperationException,其中包含類似於以下內容的消息:

在同一個上下文,一個非同步操作還沒完成,另一個操作就開始了。。 這通常是由使用同一個 DbContext 實例的不同線程引起的,但不保證實例成員是線程安全的。

檢測不到併發訪問時,可能會導致未定義的行為、應用程式崩潰和數據損壞。

 

3. 上下文池

DbContext 通常是一個輕型對象:創建和釋放它不涉及資料庫操作,而大多數應用程式都可以這樣做,而不會對性能產生任何明顯的影響。 但是,每個上下文實例確實設置了執行其職責所需的各種內部服務和對象,在高性能方案中,持續執行此操作的開銷可能很大。 對於這些情況,EF Core 可以 共用 上下文實例:釋放上下文時,EF Core 會重置其狀態並將其存儲在內部池中;下一次請求新實例時,將返回該共用實例,而不是設置新的實例。 上下文池允許你在程式啟動時僅支付一次上下文設置成本,而不是連續付費。

請註意,上下文池與資料庫連接池正交,後者在資料庫驅動程式的較低級別進行管理。

依賴註入形式

使用 EF Core 的 ASP.NET Core 應用中的典型模式涉及通過 AddDbContext將自定義DbContext類型註冊到依賴項註入容器中。 然後,將通過控制器或 Razor Pages 中的構造函數參數獲取該類型的實例。

若要啟用上下文池,AddDbContext只需將 替換為 AddDbContextPool

builder.Services.AddDbContextPool<WeatherForecastContext>(
    o => o.UseSqlServer(builder.Configuration.GetConnectionString("WeatherForecastContext")));

 

參數poolSizeAddDbContextPool設置池保留的最大實例數, (EF Core 6.0 中預設為 1024,在) 早期版本中預設為 128。 一旦超過 poolSize,就不會緩存新的上下文實例,EF 會回退到按需創建實例的非池行為。

 

非依賴註入形式

EF Core 6.0 引入無需依賴關係註入的池。

若要在不使用依賴項註入的情況下使用上下文池,請 PooledDbContextFactory 初始化 並從中請求上下文實例:

var options = new DbContextOptionsBuilder<PooledBloggingContext>()
    .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True")
    .Options;

var factory = new PooledDbContextFactory<PooledBloggingContext>(options);

using (var context = factory.CreateDbContext())
{
    var allPosts = context.Posts.ToList();
}

 

PooledDbContextFactory 構造函數的 poolSize 參數設置池保留的最大實例數(在 EF Core 6.0 中預設為 1024,在以前的版本中為 128)。 一旦超過 poolSize,就不會緩存新的上下文實例,EF 會回退到按需創建實例的非池行為。

連接池優化

連接池溢出的問題:

System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.   at System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)

 

 

每個 DbContext 實例都會占用一個資料庫連接(SqlConnection),不啟用 DbContextPool 的時候,請求一結束,對應 DbContext 實例就被 Dispose ,資料庫連接就會被放回連接池。而使用 DbContextPool 的時候,請求結束後 DbContext 不會被 Dispose 而是被放回 DbContextPool ,DbContext 被放回屬於自己的池中,就意味它對應的資料庫連接不會被放回它所屬的連接池。DbContextPool 中的每一個 DbContext 都對應一個資料庫連接,DbContextPool 中每多一個 DbContext ,資料庫連接池中就會少一個資料庫連接。當這兩個池的大小不一樣且 DbContextPool 大於資料庫連接池,問題就來了,DbContextPool 根據自家池(假設是128)子的大小暢快地向池中填 DbContext ,渾然不顧資料庫連接池的大小(假設是100),當填到第 101 個 DbContext 時就會出現上面的錯誤。

解決辦法:

可以有兩種方法:

  1. 將DbContextPool大小設置為比資料庫最大連接數小即可

    • 以Mysql為例,查詢當前MySQL最大連接數據

      show variables like '%max_connections%';

       

       

    • 設置DbContextPool池大小

      builder.Services.AddDbContextPool<MySqlBlogContext>(p =>
      {
          p.UseMySql(builder.Configuration.GetConnectionString("MySQL"), new MySqlServerVersion("5.7"));
         
      },poolSize:127);

       

       

  2. 如果資料庫伺服器性能較好,可以將資料庫最大連接數設置為比DbContextP

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡述springMVC工作流程 Spring MVC是一個基於Java的開源MVC框架,用於構建Web應用程式。它通過將應用程式分解為模型(Model)、視圖(View)和控制器(Controller)三個部分,以提高應用程式的可維護性和可擴展性。以下是Spring MVC的基本工作流程: 客戶端發 ...
  • 來源:https://www.163.com/dy/article/G9K7V11T05373SPQ.html 今天在地鐵認識一個女(碩士),我邀請她來我公司面試,她要求15000一個月,聽她說被外包公司騙了,合同都是套路,被裁員後只獲得4000元的賠償,就這個舉動,我感覺她是一個職場小白,我看她學 ...
  • 一.什麼是Tomact? Tomcat是一個開源免費的輕量級Web伺服器,它是一個軟體程式,主要功能是提供網上信息瀏覽服務,對HTTP協議的操作進行封裝,使得程式員不必對協議進行操作,讓Web開發更加便捷。 Tomcat官網 二.Tomcat的安裝 註意:由於Tomcat依賴Java,請在Tomca ...
  • PlayEdu —— 一個適用於搭建企業內部培訓平臺的開源系統。採用前後端分離的模式,後端基於 Java + SpringBoot3 + MySQL 開發,前端採用 React18 為核心框架。 ...
  • 在Qt中,信號與槽(Signal and Slot)是一種用於對象之間通信的機制。是Qt框架引以為傲的一項機制,它帶來了許多優勢,使得Qt成為一個強大且靈活的開發框架之一。信號與槽的關聯通過`QObject::connect`函數完成。這樣的機制使得對象能夠以一種靈活而鬆散耦合的方式進行通信,使得組... ...
  • EF Core 提供兩種主要方法來保持 EF Core 模型和資料庫架構同步。至於我們應該選用哪個方法,請確定你是希望以 EF Core 模型為準還是以資料庫為準。 如果希望以 EF Core 模型為準,請使用遷移。 對 EF Core 模型進行更改時,此方法會以增量方式將相應架構更改應用到資料庫, ...
  • .NET Core MVC基礎之返迴文件類型📄 前言 上一篇文章講了基礎的返回類型,這篇文章講解如何返迴文件類型給瀏覽器下載。 系列文章 .NET MVC基礎之頁面傳值方式 通過圖片流來返回圖片 返回類型介紹 在返迴文件之前,要知道MIME 類型,這裡介紹常用的幾種: text/plain:純文本 ...
  • 模型創建分為正向工程(CodeFirst)與反向工程(DbFirst). 正向工程的模型配置也可以創建任意的資料庫關係對象,如:欄位,欄位說明,表,索引,外鍵等等。 可在派生上下文中替代 OnModelCreating 方法,並使用 ModelBuilder API 來配置模型。 此配置方法最為有效 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...