为什么 EF Core 5 不在我的实体 "Address" 的 "Id" 属性 上使用“[Key]”属性创建 "Primary Key Autoincrement"?

Why EF Core 5 does not create "Primary Key Autoincrement" using "[Key]" attribute on "Id" property of my entity "Address"?

我在我的 VS 2019 项目中使用 Microsoft.EntityFrameworkCore v5.0.3(运行 on .NET Core 3.1)。

正如您在实体 class Address 中看到的那样,第一个 属性 int Id 具有属性 [Key]:

[Index(nameof(Country))]
[Index(nameof(ZIP))]
[Index(nameof(City))]
public class Address
{
    [Key]
    public int Id { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }

    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
    public DateTime ChangedAt { get; set; } = DateTime.UtcNow;

    [StringLength(EFConst.MAX_LEN_COUNTRY)]
    public string Country { get; set; }     
    
    [StringLength(EFConst.MAX_LEN_ZIP)]
    public string ZIP { get; set; }
    
    [StringLength(EFConst.MAX_LEN_CITY)]
    public string City { get; set; }

    [StringLength(EFConst.MAX_LEN_STREET)]
    public string Street { get; set; }
}

但是在创建数据库模式之后,我在使用 Microsoft SQL Server Management Studio 的 CREATE TABLE 脚本中既没有看到 PRIMARY KEY 也没有看到 AUTOINCREMENT你可以在这里看到:

CREATE TABLE [dbo].[Addresses]
(
    [ID] [int] NOT NULL,
    [RowVersion] [timestamp] NOT NULL,
    [CreatedAt] [datetime] NOT NULL,
    [ChangedAt] [datetime] NOT NULL,
    [Country] [nvarchar](64) NULL,
    [ZIP] [nvarchar](32) NULL,
    [City] [nvarchar](64) NULL,
    [Street] [nvarchar](128) NULL,

    CONSTRAINT [PK_dbo.Addresses] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                      ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

现在,当执行这段代码时:

var addr1 = db.Addresses.Add(new Address
{
    Country = "SampleCountry",
    City = "SampleCity",
    ZIP = "12345",
    Street = "SampleStreet 123"
});

db.SaveChanges();

我在 db.SaveChanges() 得到这个异常:

Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details

Inner Exception

SqlException: Cannot insert the value NULL into column 'ID', table 'NSA.dbo.Addresses'; column does not allow nulls. INSERT fails. The statement has been terminated.

我不知道为什么抛出异常。

为什么 table Addresses 中的 ID 列未定义为 PRIMARY AUTOINCREMENT

我已经拥有 searched/googled 整个互联网...并达到了它的边界。

solutions on Whosebug(或其他地方)的

None 对我有用! 如 official documentation of EF Core 中所述,我的简单项目应该可以工作!

我已经按照实验(单个和一些组合)进行了逐步试错,但没有成功:

我是不是做错了什么?

如何使用 EF Core 将“地址”class 的“Id”属性 定义为 PRIMARY KEY + AUTOINCREMENT?

谢谢!

使用此注释后,您是否进行了另一次迁移和数据库更新?

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

您只需要再做一次迁移并更新您的数据库

感谢@MohamedAdel,我解决了删除数据库并重新创建数据库的问题。现在“ID”列定义为

[Id] [int] IDENTITY(1,1) NOT NULL

一切都很好。 谢谢大家的帮助!