[英]Entity Framework Non Identity - Cannot insert the value NULL into column 'ID'
[英]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.