实体框架6关于SaveChanges()

时间:2016-04-26 02:45:03

标签: c# oracle entity-framework triggers

我从公共api中提取了大量数据,我首先使用EF代码将其转储到内部Oracle数据库中。我在数据库中使用触发器来自动增加主键值,我相信这就是问题源于此的地方。以下是错误消息:

  

System.InvalidOperationException:已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:保存或接受更改失败,因为“SocrataNightlyDump.Models.INCIDENT_CRIME_READBACK”类型的多个实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和Entity Framework模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用'HasDatabaseGeneratedOption'流畅API或'DatabaseGeneratedAttribute'进行代码优先配置。

     

System.InvalidOperationException:保存或接受更改失败,因为“SocrataNightlyDump.Models.INCIDENT_CRIME_READBACK”类型的多个实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和Entity Framework模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用'HasDatabaseGeneratedOption'流畅API或'DatabaseGeneratedAttribute'进行代码优先配置。

     

at System.Data.Entity.Core.Objects.ObjectStateManager.FixupKey(EntityEntry entry)
  在System.Data.Entity.Core.Objects.EntityEntry.AcceptChanges()
  at System.Data.Entity.Core.Objects.ObjectContext.AcceptAllChanges()
         在System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction)          ---内部异常堆栈跟踪结束---          在System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction)          在System.Data.Entity.Core.Objects.ObjectContext。<> c__DisplayClass2a.b__27()          在System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute [TResult](Func`1操作)          at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options,Boolean executeInExistingTransaction)          在System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions选项)          在System.Data.Entity.Internal.InternalContext.SaveChanges()          在System.Data.Entity.Internal.LazyInternalContext.SaveChanges()          在System.Data.Entity.DbContext.SaveChanges()          在C:\ Users \ Austin \ Documents \ SocrataNightlyDump \ SocrataNightlyDump \ Program.cs:第71行的SocrataNightlyDump.Program.Main(String [] args)

我将[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性放在生成的模型类中的主键值上,但这并没有解决问题。这些条目仍保存在数据库中,但在运行程序时它仍然会抛出此异常。有没有人在使用Oracle数据库并具有自动增量触发器时遇到此问题?

编辑:这是我的模型类中的相关代码:

[Table("INCIDENT_CRIME_SOCRATA_USER.INCIDENT_CRIME_READBACK")]
    public partial class INCIDENT_CRIME_READBACK
    {
        [Column("ID")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public decimal primaryKeyId { get; set; }
        ...
    }

1 个答案:

答案 0 :(得分:0)

您的模型配置正确,但you´ll have to use a sequence。 EF6处理数据库生成的字段的方式非常有限,特别是PK。