我使用Oracle EF 5.0提供程序。 Oracle 11G数据库。
这是我的数据库架构:
表具有Id作为主键。对于数据库中的每个表,都有触发器,在插入新记录时触发,EF从序列插入后获取主键。为每个表创建序列。
在我的edmx文件中,每个ID列都设置了StoreGeneratedPattern="Identity"
属性。
我的代码是:
using (var context = new Entities())
{
var title = new TITLE
{
TITLE_NUMBER = 4000001,
IS_DRAFT = "N",
REGISTRY_DATE = DateTime.Now
};
var titleName = new TITLE_NAME
{
NAME = "title name"
};
title.TITLE_NAME.Add(titleName);
context.Set<TITLE>().Add(title);
context.SaveChanges();
}
执行context.SaveChanges()
时,会抛出异常:
已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager
中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。
但更改会正确保存在数据库中。我的Title对象具有正确的标题ID和Title_Name
。我能做什么?或者我做错了什么?
哎呀。我从edmx中删除了继承,错误就消失了!....
但是所有项目都是继承的!
行动。具有相同方案的MS SQL也会出现此异常。
答案 0 :(得分:0)
从这里开始:https://entityframework.codeplex.com/workitem/2515
EF Team Triage:这是因为您使用TPC映射配置了身份。由于这两种类型映射到完全独立的表,因此您将获得重复的ID,因为数据库不知道在两个表之间生成唯一值。解决这个问题的一种方法是修改表格,使其中一个生成奇数,另一个生成偶数。
解决方法。
我们使用所有实体的共享属性创建Interface,并从edmx文件中删除继承 即。
public interface IHistoricalEntity
{
int ID { get; set; }
int ENTITY_ID { get; set; }
DateTime CREATE_DATE { get; set; }
DateTime DELETE_DATE { get; set; }
int CREATOR { get; set; }
}
在部分文件TITLE.cs
中public partial class TITLE : IHistoricalEntity
{
}
因此我们可以为项目中的所有实体使用通用版本。