C# 为什么EF试图在id列中插入NULL?
我正在使用EntityFramework4.0(模型优先)编写我的项目。在项目开始时,我遇到了这个问题:我试图在数据库中插入填充的对象,但我得到了一个例外: 无法将值NULL插入“CategoryId”列、表“ForumDB.dbo.Categories”中;列不允许空值。插入失败。声明已终止 代码: 我检查了这个物体,我确信它被填满了 以防万一:C# 为什么EF试图在id列中插入NULL?,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我正在使用EntityFramework4.0(模型优先)编写我的项目。在项目开始时,我遇到了这个问题:我试图在数据库中插入填充的对象,但我得到了一个例外: 无法将值NULL插入“CategoryId”列、表“ForumDB.dbo.Categories”中;列不允许空值。插入失败。声明已终止 代码: 我检查了这个物体,我确信它被填满了 以防万一: public Category(string name, string urlName, int index) { CategoryId =
public Category(string name, string urlName, int index)
{
CategoryId = Guid.NewGuid();
Name = name;
UrlName = urlName;
CategoryIndex = index;
}
发生了什么事?看看这个:-实体框架可能假设您的CategoryId字段是一个标识,因此将null传递给数据库,希望它为您填充。我今天遇到了这个问题,不得不从数据库中重新生成我的EF类 之后,我发现EF添加了:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
此“Id”字段以前是SQL中的标识列,但已更改为应用程序分配
我认为,如果没有该属性,EF实际上不会将ID发送到数据库(“约定优先于配置”)我创建了一个以int-ID作为PK的表,但是忘记了将“Identity Specification”设置为True今天遇到了同样的问题 下面是我如何解决这个问题的 最初我将标识种子添加到列中,但之后我将其删除。 所以我没有意识到,当在代码中首先修改列定义时
Property(x => x.Id)
.HasColumnName("Id")
.HasColumnType("int")
.IsRequired();
所以实体框架发现它是一个标识列,我得到了上面的异常
为了解决这个问题,我添加了以下内容:
HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
最后一段是这样的:
Property(x => x.Id)
.HasColumnName("Id")
.HasColumnType("int")
.IsRequired()
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
尝试将其添加到模型类.cs文件中:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CategoryId { get; set; }
或者将列CategoryId更改为identity:
CategoryId int IDENTITY(1,1)
对我来说,我有一个不同于默认模式的模式。Id键的名称是关于如何丢失模式部分的,修复了数据库中的该部分,一切都进行得很顺利。 情况如何
PK_TableName
我怎么把它改成了
PK_mySchema.TableName
İf型首试块
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Int64 PolicyID { get; set; }
0
İ如果您不使用代码优先或db优先oracle不创建be sequnce,请尝试使用序列触发
CREATE OR REPLACE TRIGGER
"a"."IHALEYOL"
before insert on "a"."IHALEYOL"
for each row
begin
select "a"."SQ_DIREK".nextval into :new."ID" from dual;
end;
序号:
我知道我有点晚了,但我是如何解决的
[Key]
[数据库生成(DatabaseGeneratedOption.None)]
IDENTITY(1,1)
[DatabaseGenerated(DatabaseGeneratedOption.None)]
至[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
每次插入时,它都会根据您在标识脚本上指定的内容递增。您的类别ID是什么数据类型?@Kyle,guid(uniqueidentifier)。它可能重复,但我先使用model,但在这个问题中,问题已在“代码优先”的范围内得到解决。@Kovpavalexey该问题中公认的答案是“代码优先”,但该问题中具体的链接答案是“模型优先”。@hvd,当我在DB-side上添加生成id时,这个问题就解决了。yep-EF假设它将在DB级别生成/增加,因此它将您的
id
列作为NULL
传递,即使其中有值。仅供参考,我认为这个答案对这个问题更有帮助:TL;DR-如果密钥不是自动生成的,则将其添加到密钥中:[DatabaseGenerated(DatabaseGenerateOption.None)]对我也有效:不需要重新生成类,只需将属性添加到属性中就可以了。你让我开心了!
CREATE OR REPLACE TRIGGER
"a"."IHALEYOL"
before insert on "a"."IHALEYOL"
for each row
begin
select "a"."SQ_DIREK".nextval into :new."ID" from dual;
end;
create sequence SQ_YETKI
minvalue 1
maxvalue 9999999999999999999999999999
start with 221
increment by 1
cache 20;