Asp.net mvc 无法将值NULL插入列';公司ID';列不允许空值。插入失败
当我试图使用EF保存到我的数据库时,我遇到了这个错误 无法将值NULL插入列“CompanyId”中。列不允许为NULL 从消息中可以明显看出问题所在,但在我的代码中看不到出现此问题的任何原因 这是我的模型:Asp.net mvc 无法将值NULL插入列';公司ID';列不允许空值。插入失败,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,当我试图使用EF保存到我的数据库时,我遇到了这个错误 无法将值NULL插入列“CompanyId”中。列不允许为NULL 从消息中可以明显看出问题所在,但在我的代码中看不到出现此问题的任何原因 这是我的模型: [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int CompanyId { get; set; } public string CompanyName { get; set; } public str
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public string CompanyCountry { get; set; }
public string CompanyCity { get; set; }
public string CompanyPostalCode { get; set; }
public string CompanyPhoneNumber { get; set; }
public string EmailCA { get; set; }
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "CompanyId,CompanyName,CompanyAddress,CompanyCountry,CompanyCity,CompanyPostalCode,CompanyPhoneNumber,EmailCA")] Company company)
{
if (ModelState.IsValid)
{
db.Companies.Add(company);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(company);
}
我期望从这些属性中获得一个自动生成的关键点,但显然这不起作用
有人能帮你解释一下吗?如果你是先做数据库还是先做模型,然后检查你的.edmx,看看在
公司ID
的属性中,存储生成模式
是否设置为标识
,计算
,或者无
。如果未正确设置,则将其更改为Identity
如果您先编写代码,则DB列不会设置为identity。基于代码的唯一解释是CompanyId的数据库列定义没有设置为identity。从DbContext执行insert时,不会提供CompanyId的值,因为它假定数据库将根据您在
CompanyId
属性上提供的属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
生成该值。(坏)模式有一个不可为空(且没有标识)的CompanyId列,这是一个例外。您可以使用存储过程来生成标识(下一个标识),我使用的是这样一个:
ALTER procedure [dbo].[ctgetNextID] @tableName nchar(40), @outid int output
AS
declare @id_next int
declare @id_table int
select @id_next = 0
declare @id_inc int
declare @sql nvarchar(200)
BEGIN TRANSACTION T1
select @id_table = bord_tableid from custom_tables where bord_caption = @tableName
exec('DECLARE my_cursor CURSOR FOR SELECT Id_NextId FROM ' +
'SQL_Identity WITH (UPDLOCK) WHERE Id_TableId ='+@id_table)
--open cursor and fetch max back
open my_cursor
fetch next from my_cursor into @id_next
if (@@fetch_status=0) begin
select @id_inc = @id_next+1
select @sql = 'update SQL_Identity set Id_NextId='+STR(@id_inc)+' where Id_TableId='+STR(@id_table)
exec(@sql)
end
close my_cursor
deallocate my_cursor
COMMIT TRANSACTION T1
select @outid = @id_next
return @outid
SET QUOTED_IDENTIFIER ON
显示您的db
CompanyId
是否为not null
@Ganesh_Devlekar错误消息已经显示数据库中的not null
,这正是它应该的。但是,如果数据库定义使其不可为null,但不使其成为标识列,则可能会出现问题。因此,查看表/列的数据库定义仍然很有用。向我们展示足够的代码来诊断问题。我刚刚编辑了问题。唯一的解释是数据库列未设置为标识。感谢您的回答。也许这确实是个问题,但我甚至不知道文件在哪里。您能帮忙吗?@RobertRoss-如果您先使用EF代码(并且基于您的模型属性),将不会有.edmx
文件。@RobertRoss因为您先编写代码,所以您确实应该参考Igor的答案。如果“未设置do indetity you Means”是identity-False。那么是的。这是我双击column@RobertRoss-对,您当前(错误)的数据库模式将该列取消标记(未标记)为标识。如果您更改数据库架构并选中(标记)CompanyId作为标识,您将修复此问题。有什么建议吗?@RobertRoss-如果您使用的是SQL,请查看或使用设计器以这种方式保存更改。