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

C# 实体框架无法将值NULL插入到设置为No的列标识规范中,c#,entity-framework,C#,Entity Framework,我首先使用实体框架代码,最近创建了一个名为importantcase的新回购模型/表 我已经像其他人一样设置了配置和模型,但是当我在代码中看到这一行时: public int CreateImportantCase(ImportantCase newImportantCase) { _context.ImportantCases.Add(newImportantCase); _context.SaveChanges(); // &

我首先使用实体框架代码,最近创建了一个名为importantcase的新回购模型/表

我已经像其他人一样设置了配置和模型,但是当我在代码中看到这一行时:

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