首先来自数据库的代码 - 无法将值 NULL 插入列“Id”,但值实际上不为空

Posted

技术标签:

【中文标题】首先来自数据库的代码 - 无法将值 NULL 插入列“Id”,但值实际上不为空【英文标题】:Code first from Database - Cannot insert the value NULL into column 'Id' but value actually is not null 【发布时间】:2020-02-04 10:00:18 【问题描述】:

我尝试添加新记录:

                 entity.Id = Id;


                _bdc.EquifaxAnswers.Add(entity);

                _bdc.SaveChanges();

并且 Id 已准确定义为主键,并且代码中的 Id 具有值(对于表来说是唯一的)。 和 EF 创建添加记录的 sql 代码:

 INSERT [dbo].[EquifaxAnswers]([FileName], [dtSend], [dtDateTime], [RecordsAll], [RecordsCorrect], 
[RecordsIncorrect], [ResendedId], [dtEmailAbout], [StartDate], [EndDate])
VALUES (@0, @1, @2, NULL, NULL, NULL, NULL, NULL, @3, @4)

正如我们所见,Id 不存在,所以_bdc.SaveChanges();create Exception:

在 25 毫秒内失败并出现错误:无法将值 NULL 插入列“Id”、表“Equifax.dbo.EquifaxAnswers”;列不允许空值。插入失败。

主键定义:

    public partial class EquifaxAnswers


    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id  get; set; 

为什么 EF 不添加 Id 到 INSERT 以及如何解决这个问题?

统一更新: 数据库中的表定义脚本:

CREATE TABLE [dbo].[EquifaxAnswers](
[Id] [int] NOT NULL,
[FileName] [nvarchar](300) NOT NULL,
[dtSend] [datetime] NOT NULL,
[dtDateTime] [datetime] NULL,
[RecordsAll] [int] NULL,
[RecordsCorrect] [int] NULL,
[RecordsIncorrect] [int] NULL,
[ResendedId] [int] NULL,
[dtEmailAbout] [datetime] NULL,
[StartDate] [datetime] NULL,
[EndDate] [datetime] NULL,
CONSTRAINT [PK_EquifaxAnswers] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

【问题讨论】:

【参考方案1】:

您已指定DatabaseGeneratedOption.None

这意味着 EF 不希望数据库生成 Id 字段,您应该自己指定 Id 字段。

如果您希望数据库自动生成Id字段,则将该列更改为IDENTITY类型,并将代码更改为DatabaseGeneratedOption.Identity

【讨论】:

我自己指定了 Id 字段——但 EF 甚至没有在 INSERT 中包含这个字段——我的问题就是这个! 还有更多 - 我也尝试过 DatabaseGeneratedOption.Identity - 同样的例外...... 您确定 EF 型号是最新的吗?看起来 EF 模型没有更新,并且仍在使用 Identity。 @DevilSuichiro - 绝对肯定,因为它总是“无” - 我很伤心 - 我使用数据库中的 Code First - 所以我无法更改数据库结构,我应该使用我所拥有的【参考方案2】:

解决方案:

            modelBuilder.Entity<EquifaxAnswers>()
            .Property(a => a.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

如果这不起作用 - 只需 卸载再次安装所有 EF 包(我不不知道为什么-但这对我有用)适用于所有依赖项目,当然是最新的稳定版本。

原因:

按照惯例,EF 将假定 主键 属性是自动生成的。所以我们需要说 EF 我们将通过我们的代码来完成。但是,不清楚为什么 DataAnnotations 不能像这样工作:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id  get; set; 

但流畅的 API 运行良好。可能原因是我两者都用。

【讨论】:

以上是关于首先来自数据库的代码 - 无法将值 NULL 插入列“Id”,但值实际上不为空的主要内容,如果未能解决你的问题,请参考以下文章

无法将值 NULL 插入列 CreationTime

无法将值 NULL 插入列“id”、表“XXX”;列不允许空值。插入失败

无法将值 NULL 插入“ID”列

无法将值 NULL 插入列 - 如何强制标识增加? [关闭]

EF Code First - 无法将值 NULL 插入列

SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败