繁体   English   中英

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

[英]Entity Framework context SaveChanges throwing NULL error

我在上下文模型中添加了一个项目并尝试保存更改,但即使使用有效值,我也会收到如下错误。 想知道它是如何在拥有所有有效值之后抛出的。

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

当您使用 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 如果您使用零 PK 的 Update() - 它会在表中插入新值(当您使用 Add() 时),例如:

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

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

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

您在评论中提到该表有一个 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM