2016-12-21 36 views
1

當我嘗試使用EF保存到我的數據庫時,出現此錯誤。無法將NULL值插入'CompanyId'列不允許空值。 INSERT失敗

不能將值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

顯示你的數據庫'CompanyId'是否吧'不null' –

+1

@Ganesh_Devlekar錯誤信息已經顯示它在數據庫中不是空的,而這正是它應該是的。但是,如果數據庫定義使其不可空,但不會使其成爲標識列,那可能會有問題。所以看到表/列的數據庫定義仍然有用。 – hvd

+0

向我們展示足夠的代碼以便能夠診斷問題。 – Amy

回答

1

如果你正在做的數據庫第一或模型,然後再檢查你的.edmx,看看是否StoreGeneratedPatternCompanyId屬性設置爲IdentityComputed,或None。如果沒有正確設置,請將其更改爲Identity

如果您先執行代碼,那麼數據庫列未設置爲身份。

+0

感謝您的答案。可能這確實是問題,但我甚至不知道該文件在哪裏。你能幫忙嗎? –

+0

@RobertRoss - 如果您首先使用EF代碼(並且您基於模型屬性),則不會有'.edmx'文件。 – Igor

+0

是的,我正在使用代碼,@Igor。 –

2

基於您的代碼的唯一解釋是,CompanyId的數據庫列定義未設置爲Identity。當您從DbContext執行插入時,將不會提供CompanyId的值,因爲它假定數據庫將根據您在CompanyId屬性中提供的屬性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]生成該值。 (壞)模式對於CompanyId有一個不可空(而且沒有標識)列,但是這個例外。

+0

如果通過「沒有設定做你的意思」是身份 - 錯誤。好的。這是我看到,當我雙擊列 –

+0

@RobertRoss - 右,您當前(錯誤)的數據庫架構已將該列作爲標識區分(未標記)。如果更改數據庫模式並檢查(標記)CompanyId作爲標識,您將解決該問題。 – Igor

+0

任何建議如何做到這一點? –

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 ='[email protected]_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 
相關問題