chatGPT幫助開發實戰解答問題和反思

来源:https://www.cnblogs.com/ncellit/archive/2023/02/23/17147559.html
-Advertisement-
Play Games

問題來自.Net開發群友 問題 我想做一個自動生成單據號的功能,但是在EFCORE里沒有行級鎖,請有什麼等價方案嗎? ChatGPT回答 在 EF Core 中確實沒有提供行級鎖(row-level locking)的功能,因為這需要對資料庫進行顯式的鎖定操作,而 EF Core 的設計理念是儘可能 ...


 

問題來自.Net開發群友

 

問題

我想做一個自動生成單據號的功能,但是在EFCORE里沒有行級鎖,請有什麼等價方案嗎?

 

ChatGPT回答

在 EF Core 中確實沒有提供行級鎖(row-level locking)的功能,因為這需要對資料庫進行顯式的鎖定操作,而 EF Core 的設計理念是儘可能不與資料庫直接交互,而是通過抽象層面的數據操作來實現,因此不鼓勵使用顯式的鎖定操作。

不過,在 EF Core 中提供了樂觀併發控制(Optimistic Concurrency Control)的功能,可以用於處理類似於行級鎖的需求。樂觀併發控制基於版本號(Version)機制實現,每個實體對象都有一個版本號屬性,當兩個用戶同時更新同一個實體對象時,EF Core 會比較它們的版本號,如果版本號不一致,則表示有衝突發生,需要執行相應的衝突解決邏輯。

因此,如果你想實現自動生成單據號的功能,並保證其唯一性,可以考慮使用樂觀併發控制的方案。具體的實現思路如下:

  1. 在你的實體對象中增加一個版本號屬性,類型為整數。

  2. 在生成單據號前,使用 EF Core 查詢最後一條記錄的單據號和版本號,得到最新的單據號和版本號。

  3. 在生成單據號時,將版本號加 1,並將單據號和版本號寫入到新的記錄中。如果寫入資料庫時發生衝突,則表示有其他用戶同時在生成單據號,此時可以重新獲取最新的單據號和版本號,並再次嘗試生成。

以下是一個簡單的示例代碼,演示瞭如何使用樂觀併發控制來生成唯一的單據號

public class Order
{
    public int Id { get; set; }
    public string OrderNo { get; set; }
    public int Version { get; set; }
}

public class OrderContext : DbContext
{
    public DbSet<Order> Orders { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>()
            .Property(o => o.Version)
            .IsConcurrencyToken();
    }
}

public class OrderService
{
    private readonly OrderContext _context;

    public OrderService(OrderContext context)
    {
        _context = context;
    }

    public string GenerateOrderNo()
    {
        string lastOrderNo = _context.Orders
            .OrderByDescending(o => o.Id)
            .Select(o => o.OrderNo)
            .FirstOrDefault();

        int lastVersion = _context.Orders
            .OrderByDescending(o => o.Id)
            .Select(o => o.Version)
            .FirstOrDefault();

        string newOrderNo = GenerateNewOrderNo(lastOrderNo);

        var order = new Order
        {
            OrderNo = newOrderNo,
            Version = lastVersion + 1
        };

        _context.Orders.Add(order);

        try
        {
            _context.SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            // 處理併發衝突
            ex.Entries.Single().Reload();
            lastOrderNo = _context.Orders
                .OrderByDescending(o => o.Id)
                .Select(o=> o.OrderNo) .FirstOrDefault(); lastVersion = _context.Orders .OrderByDescending(o => o.Id) .Select(o => o.Version) .FirstOrDefault(); newOrderNo = GenerateNewOrderNo(lastOrderNo); order.OrderNo = newOrderNo; order.Version = lastVersion + 1; _context.SaveChanges(); } return newOrderNo; } private string GenerateNewOrderNo(string lastOrderNo) { // 生成新的單據號邏輯 // ... }
}

 

反思

EFCORE 和 行級鎖,如果提問者不知道這兩者的含義根本沒法問,就算問了,回答的東西,所以chatGPT對提問者也是有要求的

再沒有chatGPT以前,我們碼農如果遇到這個問題如何解決了?

很簡單,使用各種搜索引擎,或者詢問同行,搜集零碎的信息然後最終拼湊起來

程式員在有了chatGPT之後,有什麼變化?

顯而易見,縮短了搜索的時間

總結

其實不管是以前的面向搜索引擎編程,還是面向群友編程,其實都在暗中隱喻了程式員的未來——架構師

開發軟體應用,最終是為了人類某個行業提供多一種可選方式

(例如外賣,古代也有外賣,讓店小二提餐走路送去大戶人家家裡

  後來有了馬車,單車,直到現在的摩托車,什麼變了?方式變了,最終目的並沒有改變

做開發其實也是一個道理,我們並不是做一個XX軟體去替代,而是為了原本的最終目的提供多一種方式,而程式員則是這多出來的一種方式的設計師,讓這個新的方式更加的容易被大眾接納和方便使用

要不然,我原本方式很簡單,為什麼要用你給我提供的方式呢?近些年開發行業也經常出現這種本末倒置的情況,很多碼農都不知道自己開發這些軟體應用的目的到底是為什麼,對於我們開發者而言

不管什麼技術,只是為了達成最終目的的手段,而不是最終目的

 

這也是我實在不喜歡背誦一些照本宣科的書面理論知識,而是更熱衷提出和發現程式的到設計思路

說了這麼多只是想說,程式員的未來肯定會是架構師,我們所有的技術積累我個人看來只是為了讓我們的思維從普通人轉換成程式員思維,而且我相信在未來,編程思維會如同吃飯一樣,成為每個人的必備

 


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

-Advertisement-
Play Games
更多相關文章
  • 睏倦的時候寫了個個獲取本地時間,列印總比當前時間大8小時,找了很久原因 package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now) fmt.Println("nowStr:", now.F ...
  • pandas條件替換值(where&mask) 在日常分析中,經常會遇到對數據的篩選處理相關的工作,我們可以使用loc和iloc定位分析篩選的列或行數據,下麵介紹一種高級篩選的用法where和mask。 pd.where: 替換條件(condition)為Flase處的值 pd.mask: 替換條件 ...
  • 這篇文章主要描述分散式系統中經常討論的CAP理論,它從一致性、可用性和分區容錯性是分散式系統的三個特征,我們只能滿足其中兩個特征,對於分散式系統來說,根據不同的應用場景,可以是AP,也可以是CP。 ...
  • Java ”框架 = 註解 + 反射 + 設計模式“ 之 反射詳解 每博一文案 無論幸福還是苦難,無論光榮還是屈辱,你都要自己遭遇與承受。 —————— 《平凡的世界》 孫少平 多少美好的東西消失和毀滅了,世界還像什麼事也沒有發生,是的,生活在繼續著。 可是,生活中的每一個卻在不斷地失去自己最珍貴的 ...
  • RestSharp RestSharp是一個輕量的,不依賴任何第三方的模擬Http的組件或者類庫。RestSharp具體以下特性;支持net4.0++,支持HTTP的GET, POST, PUT, HEAD, OPTIONS, DELETE等操作,支持oAuth 1, oAuth 2, Basic, ...
  • 在使用應用程式的過程中,經常要求應用程式只能運行一次。如果發現重覆開啟,應從系統進程列表中搜索到已經開啟的進程,並將該進程視窗移到最前端顯示。 記錄一下過程。 實現過程 在 Program.cs 文件的 Program 類中聲明兩個外部調用函數 [DllImport("User32")] priva ...
  • 概述 裝飾器模式 允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作為現有的類的一個包裝。這種模式創建了一個裝飾類,用來包裝原有的類,併在保持類方法簽名完整性的前提下,提供了額外的功能。 簡單理解就是動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾 ...
  • 最近新接觸了GeoServer,從零開始的研究也是折磨了好幾天,發現GeoServer這塊很多大佬分享各種解決方案,也是幫了我大忙,剛好告一個段落了,所以也貢獻一下我這幾天的研究成果,希望能幫到大家。 目標:使用GeoServer自動化發佈NetCDF文件,實現部署在Linux上自動化更新圖層 環境 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...