实体框架上下文SaveChanges抛出NULL错误

时间:2020-09-16 05:04:20

标签: c# oracle entity-framework

我已将一个项目添加到上下文模型中,并试图保存更改,但是即使具有有效值,我也会收到如下所示的错误。想知道即使拥有所有有效值后它怎么会抛出。

System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。有关详细信息,请参见内部异常。

System.Data.Entity.Core.UpdateException:更新条目时发生错误。有关详细信息,请参见内部异常。

Oracle.ManagedDataAccess.Client.OracleException:ORA-01400:无法 将NULL插入(“ DBO”。“ JOBS”。“ JOBID”)

代码:

_dbContext.Jobs.Add(new Job(){JobId = 1902456,JobExecutionId = 390023,AccountId = 1,CommandType = "Type 1"});
_dbContext.SaveChanges();

internal class JobsConfiguration : EntityTypeConfiguration<Job>
{
        public JobsConfiguration()
        {
            ToTable("JOBS");
            HasKey(g => g.JobId);
            Property(g => g.JobId).HasColumnName("JOBID");
            Property(g => g.JobExecutionId).HasColumnName("JOBEXECUTION_ID");
            Property(g => g.AccountId).HasColumnName("ACCTID");
            Property(g => g.CommandType).HasColumnName("COMMANDTYPE");
        }
}

3 个答案:

答案 0 :(得分:0)

当使用dbContext.Entity.Add(...)时-您的实体PK(JobId)必须为零,因为Add()为插入新值。 如果要修改PK值不为零的实体,请使用dbContext.Entity.Update(...)

然后您的第一个字符串必须是:

_dbContext.Jobs.Add(new Job(){JobId = 1902456,JobExecutionId = 390023,AccountId = 1,CommandType = "Type 1"});

PS如果您将Update()与零PK一起使用-它会在表中插入NEW值(使用Add()时),例如:

_dbContext.Jobs.Update(new Job(){JobId = 0,JobExecutionId = 390023,AccountId = 1,CommandType = "Type 1"});

答案 1 :(得分:0)

您必须告诉Oracle使用序列来存储和更新自动递增的PK。我认为这是Oracle特有的:

totalCount

答案 2 :(得分:0)

您在注释中提到该表具有一个id列。也许这会导致您得到错误,afaik EF暗中假定这是主键。解决方案可以是为JobsId创建唯一索引,而不是使其成为主键或显式忽略id属性。在EF Core中,唯一索引是这样完成的:

entity.HasIndex(e => e.JobsId)
      .HasName("SYS_C00296922")
      .IsUnique();

entity.Property(e => e.JobsId)
      .HasColumnName("JobsId");

对于EF 6.1的描述如下:

https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/types-and-properties

此处针对EF Core和EF 6描述了如何忽略属性:https://stackoverflow.com/a/10385738/4712865

相关问题