公司要求使用 .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做任何操作,直接會自增長,多少條都能保存成功。
我也是把三個類型試了遍才發現的,寫下來給大家提個醒,可以少走點彎路。