我已将一个项目添加到上下文模型中,并试图保存更改,但是即使具有有效值,我也会收到如下所示的错误。想知道即使拥有所有有效值后它怎么会抛出。
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");
}
}
答案 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