我一直在经历着的ObjectContext不一致的状态异常:实体框架TPC:为什么BaseEntity ID需要是Guid类型?
到数据库的更改已成功提交,但在更新对象上下文时发生错误 。 ObjectContext可能是 处于不一致状态。内部异常消息:AcceptChanges 无法继续,因为对象的键值与ObjectStateManager中的另一个 对象冲突。在调用AcceptChanges之前,确保键值为 唯一。
这似乎发生时,我的基实体(因为使用TPC抽象)具有
public int Id { get; set;}
,其被配置为通过所述数据库生成的主密钥:
// Base Entity
modelBuilder.Entity<BaseEntityObject>().HasKey(t => t.Id);
modelBuilder.Entity<BaseEntityObject>().Property(t => t.Id).
HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
和衍生实体也继承这一点并试图将其用作主键。
当您实例化两种不同类型的派生条目时,将它们添加到DbContext中,然后尝试SaveChanges(),异常被触发。但是,当Id字段从int更改为Guid时:
public Guid Id { get; set;}
此异常不再被抛出。
有人可以解释为什么发生这种情况时,Id属性的类型为int?
有没有解决方法呢?让每个派生实体都拥有Guid PK似乎有点浪费。
您可以发布你的基地和子类的一个例子吗?另外,您的ID列是否在编辑器中标记为IsIdentity? – Robert
我绝对可以发布一个基础和一个孩子类的例子。你的意思是“你的ID列,在编辑器中标记为IsIdentity”? – blgrnboy
您的'ID'列是否标记为'PrimaryKey'并且设置为数据库中的'Identity'列,如果是,它是否在EDMX模型编辑器中将EntityKey属性设置为'true'? – Robert