带有oracle实体框架5的context.SaveChanges()中的操作异常无效

时间:2014-09-22 09:15:58

标签: c# entity-framework oracle11g ef-database-first

我使用Oracle EF 5.0提供程序。 Oracle 11G数据库。 这是我的数据库架构: Database scheme

表具有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也会出现此异常。

1 个答案:

答案 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
{
}

因此我们可以为项目中的所有实体使用通用版本。