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

时间:2015-07-28 10:47:34

标签: c# entity-framework

我首先使用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不会追溯地解决这个问题。身份规范,有没有办法解决这个问题?

2 个答案:

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