当我尝试使用EF保存到我的数据库时,我收到此错误。
无法将值NULL插入列' CompanyId'列不允许空值。
从消息中可以看出问题是什么,但是我的代码中没有任何理由可以解决这个问题。
这是我的模特:
[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);
}
我期望从这些属性中得到一个自动生成的密钥,但显然这不起作用。
有人可以帮忙解释一下吗?
答案 0 :(得分:2)
基于您的代码的唯一解释是CompanyId的数据库列定义未设置为Identity。当您从DbContext执行插入时,将不会提供CompanyId的值,因为它假定数据库将根据您在[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
属性上提供的属性CompanyId
生成它。 (坏)模式对于CompanyId具有不可为空(并且没有标识)列,这是异常。
答案 1 :(得分:1)
如果您先打开数据库或先建模,请检查您的.edmx,看看CompanyId
的属性StoreGeneratedPattern
是否设置为Identity
,{{ 1}}或Computed
。如果未在此处正确设置,请将其更改为None
。
如果您首先执行代码,则DB列未设置为标识。
答案 2 :(得分:0)
您可以使用存储过程生成标识(下一个id),我使用如下:
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