问题描述
我在 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 中所述,我的简单项目应该可以运行!
我已经在实验(单个和一些组合)之后一步一步地试错了,但没有成功:
- 使用“数据注释”(属性):
- 将
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 将“Address”类的“Id”属性定义为 PRIMARY KEY + AUTOINCREMENT?
谢谢!
解决方法
在使用此注解后,您是否进行了另一次迁移和数据库更新?
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
您只需要进行另一次迁移并更新您的数据库
,感谢@MohamedAdel,我解决了删除数据库并重新创建它的问题。现在“ID”列定义为
[Id] [int] IDENTITY(1,1) NOT NULL
一切都很好。 谢谢大家的帮助!