实体框架无法将值NULL插入设置为No的列标识规范中
本文关键字:No 标识 范中 设置 插入 框架 NULL 实体 | 更新日期: 2023-09-27 18:05:10
我首先使用实体框架代码,最近创建了一个新的Repo模型/表,名为ImportantCases。
我已经设置了配置和模型,就像其他的一样,但是当我在我的代码中到达这一行时:
public int CreateImportantCase(ImportantCase newImportantCase)
{
_context.ImportantCases.Add(newImportantCase);
_context.SaveChanges(); // <--- here
return newImportantCase.ImportantId;
}
我得到这个错误:
不能在表的列'ImportantId'中插入NULL值"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
是从视图返回的视图模型的Id,我刚刚将类别和评论属性滚动到这个视图模型中,以便在控制器中分别处理它们。
编辑
我刚刚意识到,当我最初运行update-database
时,我愚蠢地将ImportantId
设置为字符串,但随后添加了一个新的迁移来纠正这一点,没有意识到EF没有回顾性地整理出身份规范,是否有办法解决这个问题?
我做了以下工作来纠正这个问题:
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");
}
}
In model 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;} }