我首先使用Entity Framework代码,最近创建了一个名为ImportantCases的新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);
}
我在newImportantCase
之前检查了SaveChanges
对象,它看起来像我期望的那样,ImportantId
设置为'0',通常EF只会创建ID一旦写完成。
我注意到的一件事是,当我查看该表的设计时,身份规范设置为No
,EF创建的所有其他表都设置为Yes
,我有什么做得与众不同?
注意
EvpId
是从视图返回的viewmodel的Id,我刚刚将类别和注释属性滚动到此viewmodel中,以便在控制器中单独处理它们。
修改
我刚刚意识到,当我最初运行ImportantId
时,我愚蠢地将update-database
设置为一个字符串,但后来又添加了一个新的迁移来纠正这个问题,并没有意识到EF不会追溯地解决这个问题。身份规范,有没有办法解决这个问题?
答案 0 :(得分:4)
我做了以下事情来纠正这个问题:
1。)通过管理工作室删除有问题的表格。
2.确保模型被修改为具有实际Id(您想要的标识规范设置为是)
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");
}
}
答案 1 :(得分: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;} }