C# 实体框架无法将值NULL插入到设置为No的列标识规范中
我首先使用实体框架代码,最近创建了一个名为importantcase的新回购模型/表 我已经像其他人一样设置了配置和模型,但是当我在代码中看到这一行时:C# 实体框架无法将值NULL插入到设置为No的列标识规范中,c#,entity-framework,C#,Entity Framework,我首先使用实体框架代码,最近创建了一个名为importantcase的新回购模型/表 我已经像其他人一样设置了配置和模型,但是当我在代码中看到这一行时: public int CreateImportantCase(ImportantCase newImportantCase) { _context.ImportantCases.Add(newImportantCase); _context.SaveChanges(); // &
public int CreateImportantCase(ImportantCase newImportantCase)
{
_context.ImportantCases.Add(newImportantCase);
_context.SaveChanges(); // <--- here
return newImportantCase.ImportantId;
}
EF配置
在SaveChanges之前,我检查了NewImportanceCase对象,它看起来和我预期的一样,ImportantId设置为“0”,通常EF只会在写入完成后创建ID
然而,我注意到的一件事是,当我查看该表的设计时,标识规范设置为“否”,EF创建的所有其他表都设置为“是”,我做了哪些不同的操作
注
EvpId是从视图返回的viewmodel的Id,我刚刚将category和comment属性滚动到这个viewmodel中,以便在控制器中单独处理它们
编辑
我刚刚意识到,当我运行最初的更新数据库时,我愚蠢地将ImportantId设置为字符串,但后来添加了一个新的迁移来纠正这一点,没有意识到EF不会回顾性地整理标识规范,有没有办法解决这个问题?在模型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;} }
我采取了以下措施来纠正此问题: 一,。通过ManagementStudio删除有问题的表 二,。确保对模型进行了修改,使您想要的实际Id作为标识规范设置为“是” 三,。通过Package Manager控制台创建新的迁移,如:
add-migration "Set ImportantId as Identity Specification"
四,。如果没有任何更改,您将看到一个空的Up和Down方法
五,。使用最初引入此表的迁移内容修改这些,但请确保这次将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");
}
}
要设置标识规范,您可以执行以下操作[Key][DatabaseGeneratedAttributeDatabaseGeneratedOption.Identity]public int ImportantId{get;set;}@Eldho如果我删除该表并再次运行更新数据库,那么在将ImportantId正确设置为int之后会发生什么,我想你可以按照上面的注释更新你的ImportantCase模型并尝试更新数据库,或者你可以删除表并重新运行删除整个数据库并让EF重新创建它。我使用的代码首先为我解决了这个问题,因为我还在开发阶段,所以我让数据库掉了。我想这也行。
add-migration "Set ImportantId as Identity Specification"
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");
}
}