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

问题描述

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

正如您在实体类 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:更新条目时出错。详情见内部异常

内部异常

sqlException: 无法将值 NULL 插入到列“ID”、表“NSA.dbo.Addresses”中;列不允许空值。插入失败。声明已终止。

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

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

我已经在整个互联网上进行了搜索/谷歌搜索......并到达了它的边界。

solutions on Stackoverflow(或其他地方)没有一个我有用! 如 official documentation of EF Core 中所述,我的简单项目应该可以运行!

我已经在实验(单个和一些组合)之后一步一步地试错了,但没有成功:

  • 使用“数据注释”(属性):
    • [Key]
    • [required]
    • [required,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    • [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  • Id 重命名AddressId(+ 使用上述属性的组合)
  • 通过覆盖 void OnModelCreating(...) 并使用 modelBuilder.Entity<Address>().HasKey(a => a.Id); 来使用 Fluent API
  • 属性 Id 重新定义为:int? Idint IDint? IDint AddressIdint? AddressIdint AddressID、和int? AddressID

我做错了吗?

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

谢谢!

解决方法

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

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

您只需要进行另一次迁移并更新您的数据库

,

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...