实体框架无法将值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没有回顾性地整理出身份规范,是否有办法解决这个问题?

实体框架无法将值NULL插入设置为No的列标识规范中

我做了以下工作来纠正这个问题:

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