2016-04-26 194 views
0

我从一个公共api中提取大量数据,并且首先使用EF代码将其转储到内部Oracle数据库中。我在数据库中使用了一个触发器来自动递增主键值,我相信这是问题产生的原因。以下是错误消息:实体框架6 SaveChanges上的主键问题()

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

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

在System.Data.Entity.Core.Objects.ObjectStateManager.FixupKey(EntityEntry条目)
在System.Data.Entity.Core.Objects.EntityEntry.AcceptChanges()
在System.Data.Entity.Core .Objects.ObjectContext.AcceptAllChanges()
在System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项,IDbExecutionStrategy executionStrategy,布尔startLocalTransaction) ---内部异常堆栈跟踪的结尾--- 在系统.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction) at System.Data。 Entity.Core.Objects.ObjectContext。 <> c__DisplayClass2a.b__27() at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute [TResult](Func`1 operation) at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options,Boolean executeInExistingTransaction ) at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 在用C System.Data.Entity.DbContext.SaveChanges() 在SocrataNightlyDump.Program.Main(字串[] args):\用户\奥斯汀\文件\ SocrataNightlyDump \ SocrataNightlyDump \ Program.cs的:线71

我将[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; } 
     ... 
    } 
+0

向我们展示代码! – dotctor

回答

0

你的模型具有正确的配置,但you´ll have to use a sequence。EF6在处理数据库生成的字段方面相当有限,特别是PK。

+0

我在我的数据库中插入了一个序列和触发器,问题是,尽管在模型类中我的PK变量具有'[DatabaseGenerated(DatabaseGeneratedOption.Identity)]'属性,它仍然会抛出上述错误。 – Otto45