无法将值NULL插入列'Id',表';列不允许空值

时间:2018-01-05 00:49:16

标签: c# sql-server entity-framework code-first

我在实体框架中看到了一个奇怪的行为。我正在使用代码优先方法来定义两个实体之间的一对多关系:

nrow()

这就是我在尝试将项目添加到aDataTable[(nrow(theData)-4):nrow(theData),1:3]

public class IncomingCheck : AuditedEntityBase
{
    [Key]
    public int Id { get; set; }

    [Required]
    public virtual CheckType Type { get; set; }

    [Required]
    public virtual Bank Bank { get; set; }
    public string Branch { get; set; }

    public virtual IList<IncomingCheckHistory> History { get; set; }
}

public class IncomingCheckHistory
{
    [Key]
    public int Id { get; set; }
    public string LongDescription { get; set; }
}

但它抛出一个异常,说“不能将值NULL插入列'Id'”。但是我总是像这样做。数据库应该使用唯一编号填充History列本身。

我错过了什么?

更新

使用SSProfiler,我得到了在数据库上运行的查询。它如下:

using (var db = new CheckDataContext())
{
    foreach (var check in SelectedItems)
    {
        var dbCheck = await db.IncomingChecks.FindAsync(check.Id);

        var history = new IncomingCheckHistory()
        {
            LongDescription = "something",
        };

        dbCheck.History.Add(history);
        await db.SaveChangesAsync(); //throws the exception
    }
}

请注意Id应该获取ID本身,对吗?

2 个答案:

答案 0 :(得分:0)

不应将Id设置为标识吗? 像这样:

public class IncomingCheckHistory
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Key]
    public string LongDescription { get; set; }
}

希望这是您问题的解决方案!

答案 1 :(得分:0)

出于某种奇怪的原因,确切的代码在完全删除数据库和迁移并从头开始之后仍然有效。我不确定为什么没有迁移就行不通。此外,我曾尝试删除数据库,但当时我尝试了一些不同的代码。

在任何情况下,发布的代码/查询都应该有效。我还检查了数据库和列,看看是否有什么不同,但事实并非如此。如果有人能够解释为什么它不起作用而现在就是这样,我将不胜感激。