首先来自数据库的代码 - 无法将值 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 插入列“id”、表“XXX”;列不允许空值。插入失败