为什么 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 中所述,我的简单项目应该可以工作!
我已经按照实验(单个和一些组合)进行了逐步试错,但没有成功:
- 使用“数据注释”(属性):
[Key]
[Required]
[Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- 将
Id
重命名为 AddressId
(+ 使用上述属性的组合)
- 通过覆盖
void OnModelCreating(...)
并使用 modelBuilder.Entity<Address>().HasKey(a => a.Id);
使用 Fluent API
- 重新定义 属性
Id
为:int? Id
、int ID
、int? ID
、int AddressId
、int? AddressId
、 int AddressID
和 int? AddressID
我是不是做错了什么?
如何使用 EF Core 将“地址”class 的“Id”属性 定义为 PRIMARY KEY + AUTOINCREMENT?
谢谢!
使用此注释后,您是否进行了另一次迁移和数据库更新?
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
您只需要再做一次迁移并更新您的数据库
感谢@MohamedAdel,我解决了删除数据库并重新创建数据库的问题。现在“ID”列定义为
[Id] [int] IDENTITY(1,1) NOT NULL
一切都很好。
谢谢大家的帮助!
我在我的 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 中所述,我的简单项目应该可以工作!
我已经按照实验(单个和一些组合)进行了逐步试错,但没有成功:
- 使用“数据注释”(属性):
[Key]
[Required]
[Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- 将
Id
重命名为AddressId
(+ 使用上述属性的组合) - 通过覆盖
void OnModelCreating(...)
并使用modelBuilder.Entity<Address>().HasKey(a => a.Id);
使用 Fluent API
- 重新定义 属性
Id
为:int? Id
、int ID
、int? ID
、int AddressId
、int? AddressId
、int AddressID
和int? AddressID
我是不是做错了什么?
如何使用 EF Core 将“地址”class 的“Id”属性 定义为 PRIMARY KEY + AUTOINCREMENT?
谢谢!
使用此注释后,您是否进行了另一次迁移和数据库更新?
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
您只需要再做一次迁移并更新您的数据库
感谢@MohamedAdel,我解决了删除数据库并重新创建数据库的问题。现在“ID”列定义为
[Id] [int] IDENTITY(1,1) NOT NULL
一切都很好。 谢谢大家的帮助!