Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 无法将值NULL插入列';公司ID';列不允许空值。插入失败_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 无法将值NULL插入列';公司ID';列不允许空值。插入失败

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

当我试图使用EF保存到我的数据库时,我遇到了这个错误

无法将值NULL插入列“CompanyId”中。列不允许为NULL

从消息中可以明显看出问题所在,但在我的代码中看不到出现此问题的任何原因

这是我的模型:

[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,请查看或使用设计器以这种方式保存更改。