抱歉我的英文。
我正在使用Entity Framework 4.0(模型优先)编写我的项目。 在项目开始时,我遇到了这个问题:我试图在数据库中插入填充的对象,但我得到了一个例外:
“无法将值NULL插入列'CategoryId',表'ForumDB.dbo.Categories';列不允许空值.INSERT失败。语句已终止。”
Category usingCategory = new Category("Using Forums", "usingforums", 0);
using (Context)
{
Context.Categories.AddObject(usingCategory);
Context.SaveChanges();
}
我检查了这个对象,我确信它已被填满。
以防万一:
public Category(string name, string urlName, int index)
{
CategoryId = Guid.NewGuid();
Name = name;
UrlName = urlName;
CategoryIndex = index;
}
请告诉我发生了什么事? 谢谢你的帮助!
答案 0 :(得分:37)
看看这个:https://stackoverflow.com/a/5338384/171703 - 实体框架可能假设您的CategoryId字段是一个标识,因此将null传递给数据库,期望它为您填充它。
答案 1 :(得分:26)
我今天碰到了这个,不得不从数据库中重新生成我的EF类。
在这之后,我发现EF补充道:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
到此“Id”字段,该字段曾经是SQL中的标识列,但已更改为应用程序分配。
我认为如果您没有该属性,EF将不会将ID实际发送到数据库('约定优于配置')
答案 2 :(得分:5)
我用int Id创建了表作为PK,但忘了设置“Identity Specification”= True
答案 3 :(得分:2)
尝试将其添加到模型类.cs文件中:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CategoryId { get; set; }
或将您的列CategoryId更改为标识:
CategoryId int IDENTITY(1,1)
答案 4 :(得分:0)
今天遇到了同样的问题。
这是我找出问题的方式。
我最初将标识种子添加到该列中,但是之后我将其删除。 因此,我没有意识到,在首先修改代码中的列定义时,ID
属性(x => x.Id).HasColumnName(@“ Id”)。HasColumnType(“ int”)。IsRequired();
因此Entity框架发现这是一个Identity列,而我在上面遇到了异常。
要解决此问题,添加了“ HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)”,因此最后一部分类似于:
属性(x => x.Id).HasColumnName(@“ Id”)。HasColumnType(“ int”)。IsRequired()。HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
答案 5 :(得分:0)
For me I had a different schema other than default one. The name of the Id key was some how missing the that schema part - fixed that in the database and it all went well. How it was ;
PK_TableName
How I changed it to
PK_mySchema.TableName
答案 6 :(得分:0)
İf模型首次尝试块
ID : 1, Data : [915, 565, 591, 254, 67]
ID : 2, Data : [915, 565, 591, 254, 67, 258, 57, 767, 866, 986, 558, 187, 976]
答案 7 :(得分:0)
0
如果您不先使用代码或先使用db,则oracle不要创建序列,而是尝试使用序列触发
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;
答案 8 :(得分:0)
我知道我来晚了,但是这是我设法解决的方法。
我在模型中将这些属性包括到我的int PK中。 (让我的种子在configuration.cs中)
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
插入种子后,我在Visual Studio中使用SQL Server对象资源管理器,并通过右键单击表并按“视图设计器”转到该模型的表。
在下面,您将看到为创建该表而生成的脚本。在主键属性之后插入此命令。
IDENTITY(1,1)
更新数据库后,返回模型并更改此属性:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
至[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
保存,添加迁移,然后更新数据库应执行此操作。
每次插入时,它现在都会增加,具体取决于您在IDENTITY脚本中指定的内容。