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

问题描述 投票:0回答:2

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

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

而这里是我,我正在尝试添加一个项目到History

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

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

我错过了什么?

Update:

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

exec sp_executesql N'INSERT [dbo].[IncomingCheckHistories]([LongDescription], [IncomingCheck_Id])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[IncomingCheckHistories]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()',N'@0 nvarchar(max) ,@1 int',@0=N'Something',@1=1

请注意,scope_identity()应该获得Id本身,对吗?

c# sql-server entity-framework code-first
2个回答
0
投票

不应该将Id设置为身份吗?像这样:

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

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.