簡體   English   中英

實體框架無法將值 NULL 插入設置為否的列標識規范

[英]Entity Framework Cannot insert the value NULL into column Identity Specification set to No

我首先使用實體​​框架代碼,最近創建了一個名為重要案例的新 Repo 模型/表。

我已經像其他人一樣設置了配置和模型,但是當我在代碼中看到這一行時:

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

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

            return newImportantCase.ImportantId;
        }

我收到此錯誤:

無法將值 NULL 插入列“ImportantId”、表“MyDatabase.dbo.ImportantCases”; 列不允許空值。 插入失敗。 該語句已終止。

我的模型/配置如下所示:

模型

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);
        }
    }

在調用 create 方法之前,我使用視圖模型和模型綁定通過 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);
                }

我在SaveChanges之前檢查了newImportantCase對象,它看起來和我預期的一樣, ImportantId設置為“0”,通常 EF 將在寫入完成后創建 ID。

然而,我注意到的一件事是,當我查看該表的設計時,身份規范設置為No ,EF 創建的所有其他表都設置為Yes ,我做了什么不同的事情?

筆記

EvpId是從視圖返回的視圖EvpId的 ID,我剛剛將類別和評論屬性滾動到此視圖模型中,以便在控制器中單獨處理它們。

編輯

我剛剛意識到,當我最初運行update-database時,我愚蠢地將ImportantId ID 設置為一個字符串,但后來添加了一個新的遷移來糾正這個問題,沒有意識到 EF 沒有追溯整理身份規范,有沒有辦法解決這個問題?

我做了以下事情來糾正這個問題:

1.) 通過管理工作室刪除有問題的表。

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");
        }
    }

在模型 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;} }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM