[英]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.