2015-07-28 64 views
2

我先使用實體​​框架代碼並最近創建了一個名爲ImportantCases的新Repo模型/表。實體框架無法將NULL值插入列標識規範設置爲否

我已經建立了就像所有其他的配置和型號然而,當我到達這條線在我的代碼:

public int CreateImportantCase(ImportantCase newImportantCase) 
     { 
      _context.ImportantCases.Add(newImportantCase); 

      _context.SaveChanges(); // <--- here 

      return newImportantCase.ImportantId; 
     } 

我收到此錯誤:

Cannot insert the value NULL into column 'ImportantId', table 'MyDatabase.dbo.ImportantCases'; column does not allow nulls. INSERT fails. The statement has been terminated.

我的模型/配置是這樣的:

型號

public class ImportantCase 
{ 
    public int ImportantId { get; set; } 
    public int EvpId { get; set; } 
    public string Comment { get; set; } 
    public int CategoryId { get; set;} 
} 

EF配置

class ImportantCaseConfiguration : EntityTypeConfiguration<ImportantCase> 
    { 
     public ImportantCaseConfiguration() 
     { 
      HasKey(x => x.ImportantId); 
     } 
    } 

之前要調用的創建方法,我使用視圖模型和模型綁定通過從視圖Post方法建立新ImportantCase

if (imp != null) // already a record, so update 
       { 
        imp.Comment = modifiedExceptionPersonViewModel.Comment; 
        imp.CategoryId = int.Parse(modifiedExceptionPersonViewModel.SelectedCategory); 
        _service.UpdateImportantCase(imp); 
       } 
       if (imp == null) //no record so create 
       { 
        ImportantCase newImportantCase = new ImportantCase(); 
        newImportantCase.Comment = modifiedExceptionPersonViewModel.Comment; 
        newImportantCase.CategoryId = int.Parse(modifiedExceptionPersonViewModel.SelectedCategory); 
        newImportantCase.EvpId = modifiedExceptionPersonViewModel.EvpId; 
        _service.CreateImportantCase(newImportantCase); 
       } 

我檢查了newImportantCase對象之前SaveChanges,它看起來和我所期望的一樣,ImportantId設置爲「0」,通常EF將會創建一旦寫入完成,即爲ID。

但我注意到的一件事是,當我查看該表的設計時,EF規範創建的所有其他表都設置爲Yes,我做了哪些改變?

EvpId是正在從視圖返回的視圖模型的ID,我剛剛推出的類別和註釋屬性這個視圖模型,以便在控制器分別處理。

編輯

我剛剛意識到我愣神設置ImportantId爲字符串,當我跑最初update-database但後來增加了一個新的遷移稍後糾正這一點,並沒有意識到EF不追溯理清身份規範,有沒有辦法解決這個問題?

+0

要設置標識規範,你可以做到這一點'[關鍵] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity) 公衆詮釋ImportantId {獲得;組; }' – Eldho

+0

@Eldho如果我現在刪除那個表並運行update-database,會發生什麼,因爲我已經將ImportantId正確設置爲int了,它會對它進行排序嗎? – JsonStatham

+0

我想你可以按照上面的註釋來更新你的'ImportantCase'模型並嘗試更新數據庫,否則你可以刪除表並重新運行 – Eldho

回答

4

我做了以下解決這個問題,:

1)通過Management Studio中刪除有問題的表。

2)確保模型修改爲有實際的ID(你想要的東西標識規範設置爲Yes)

3。)通過包管理器控制檯創建一個新的遷移,是這樣的:

add-migration "Set ImportantId as Identity Specification" 

4)如果沒有任何事情改變了,你會看到一個空Up()Down()方法

5)用的內容修改這些移民,最初推出的這款表,但請務必將ID設置爲一個int這個時候,所以這個:

public partial class addedimportantcasetable : DbMigration 
    { 
     public override void Up() 
     { 
      CreateTable(
       "dbo.ImportantCases", 
       c => new 
        { 
         ImportantId = c.String(nullable: false, maxLength: 128), 
         EvpId = c.Int(nullable: false), 
         Comment = c.String(), 
         CategoryId = c.Int(nullable: false), 
        }) 
       .PrimaryKey(t => t.ImportantId);     
     } 

     public override void Down() 
     { 
      DropTable("dbo.ImportantCases"); 
     } 
    } 

被複制到新的遷移,但略有改變,以這樣的:

public partial class SetImportantIdasIdentitySpecification : DbMigration 
    { 
     public override void Up() 
     { 
      CreateTable(
       "dbo.ImportantCases", 
       c => new 
       { 
        ImportantId = c.Int(nullable: false, identity: true), 
        EvpId = c.Int(nullable: false), 
        Comment = c.String(), 
        CategoryId = c.Int(nullable: false), 
       }) 
       .PrimaryKey(t => t.ImportantId); 
     } 

     public override void Down() 
     { 
      DropTable("dbo.ImportantCases"); 
     } 
    } 
+0

刪除整個數據庫並讓EF重新創建它(我先使用代碼)爲我解決了這個問題,因爲我還處於開發階段,所以我讓數據庫掉線。我想這也會起作用。 –

0

模型ImportantCase將int更改爲int?

public class ImportantCase { 
public int? ImportantId { get; set; } 
public int EvpId { get; set; } 
public string Comment { get; set; } 
public int CategoryId { get; set;} } 
相關問題