无法将值NULL插入列' CompanyId'列不允许空值。 INSERT失败

时间:2016-12-21 14:16:18

标签: asp.net-mvc entity-framework

当我尝试使用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);
}

我期望从这些属性中得到一个自动生成的密钥,但显然这不起作用。

有人可以帮忙解释一下吗?

3 个答案:

答案 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