如何使EF Core不插入MySql中自增長的主鍵(踩坑實錄)


公司要求使用 .Net Core + EF Core + Mysql 開發項目,為了以后可以部署到Linux服務器上,實際是奇葩的客戶需求。

數據庫設計時雖然大部分表的主鍵都采用了UUID(也就是SQL Server的GUID),好處是啥我也就不(bu)說(hui)了(shuo),大家自行百度下吧。

而對於一些不是那么重要的表,或者說會經常產生大量數據的表,我們都是用自增長的主鍵,然后重點來了,在使用“Scaffold”命令生成實體類的時候,是下面這樣的:

public partial class File
    {
        public int Id { get; set; }
        public string FileName { get; set; }
        public string FileType { get; set; }
        public string FileSize { get; set; }
        public string FilePath { get; set; }
        public string ProId { get; set; }
        public string CreateUser { get; set; }
        public string CreateUserName { get; set; }
        public DateTime CreateTime { get; set; }
        public int IsDel { get; set; }
    }

可以看到,該表的Id是Int型,也就是自增長的主鍵,而如果我們直接使用的話,那么在你不對主鍵賦值的情況下,第一次肯定是插入0,第二次就直接報錯了,會提示你主鍵重復。

也就是Id並沒有自增,EF Core直接給主鍵賦值為0,並執行插入。那么怎么才能告訴EF Core我這張表的Id是自增的呢?

經過百度,查到的答案是加特性,如下:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

或者

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

告訴EF Core它是自增的,你不要管我啦。然后你以為這樣結束了?不好意思,一樣報錯,哈哈。正確答案是:

public partial class File
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }
    }

沒錯應該使用“DatabaseGeneratedOption.None”的特性,官方注釋是“The database does not generate values”。

雖然不知道為啥這個最不靠譜的卻是正確的,但事實如此。加上這個特性后,插入時不用對Id做任何操作,直接會自增長,多少條都能保存成功

我也是把三個類型試了遍才發現的,寫下來給大家提個醒,可以少走點彎路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM