EntityFramework用null替换字段并引发异常?

时间:2019-05-15 07:10:11

标签: c# sql .net entity-framework

我尝试使用EntityFramework 6向SQL数据库添加一个对象,它看起来像这样:

表:

    CREATE TABLE [dbo].[jobb](
    [starttid] [datetime] NULL,
    [sluttid] [datetime] NULL,
    [rowversion] [timestamp] NOT NULL,
    [service] [nvarchar](100) NOT NULL,
    [jobb_key] [int] NOT NULL,
CONSTRAINT [PK_service_jobb] PRIMARY KEY CLUSTERED 
(
    [jobb_key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

代表表格的类:

public class Jobb
{
    public DateTime? starttid { get; set; }
    public DateTime? sluttid { get; set; }
    [Timestamp]
    public byte[] rowversion { get; set; }
    public string service { get; set; }
    [Key]
    public int jobb_key { get; set; }

}

试图将新对象添加到数据库的代码:

            using (var context = new ServiceJobbContext(_settingsService))
        {

            var current = await context.ServiceJobb.FirstOrDefaultAsync(c => c.jobb_key == serviceJobb.jobb_key);

            if (current == null)
                current = context.ServiceJobb.Add(serviceJobb);
            else
            {
                current.service = serviceJobb.service;
                current.sluttid = serviceJobb.sluttid;
                current.starttid = serviceJobb.starttid;
                current.jobb_key = serviceJobb.jobb_key;
            }
            await context.SaveChangesAsync();
            return serviceJobb;
        }

我已经检查了jobb_key的设置,但是在运行SaveChangesAsync时仍然出现此异常:

  

SqlException:无法将值NULL插入列'jobb_key',   表'MyDB.dbo.jobb';列不允许为空。 INSERT失败。的   语句已终止。

为什么会出现此异常?

2 个答案:

答案 0 :(得分:1)

当您尝试在插入操作中向其插入空值时,您的键列[jobb_key] [int] NOT NULL不为空,因此您应更改键字段以使其能够插入或使其身份自动插入。

因此在此语句中无法插入

current = context.ServiceJobb.Add(serviceJobb);

解决方案1:

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int jobb_key { get; set; }

明确插入它,因为默认情况下它是DatabaseGeneratedOption.Identity,因此EF将其作为空传递

解决方案2:在数据库的级别表中使其标识

 [jobb_key] [int] NOT NULL  IDENTITY(1,1) ,

还要在EF中自动生成的属性中对此link进行检查

答案 1 :(得分:0)

0 1 2 3 4 5 6 7 8 9 FOO BAR 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 FOO BAR 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 0 1 2 3 4 FOO BAR 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 0 1 2 3 4 FOO BAR 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 FOO BAR 14 15 16 17 18 19 20 21 22 FOO BAR 23 2 … 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 FOO BAR 35 36 37 38 39 40 … 23 24 25 26 27 28 29 30 31 32 33 34 FOO BAR 35 36 37 38 39 40 41 42 43 44 45 46 属性添加到[Required]字段中,并将not null添加到行版本中:

[DatabaseGenerated]

注意:ValueTypes隐含为public class Jobb { public DateTime? starttid { get; set; } public DateTime? sluttid { get; set; } [Timestamp] [DatabaseGenerated] public byte[] rowversion { get; set; } [Required] public string service { get; set; } [Key] public int jobb_key { get; set; } }