【问题标题】:Invalid operation exception in context.SaveChanges() with oracle entity framwork 5使用 oracle 实体框架 5 的 context.SaveChanges() 中的无效操作异常
【发布时间】:2014-09-22 09:15:57
【问题描述】:

我使用 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 对象具有正确的 Title 和 Title_Name 的 ID。我能做些什么?还是我做错了什么?

哎呀。我从 edmx 中删除了继承,错误消失了!....

但是所有项目都是在继承中构建的!!!

操作。具有相同方案的 MS SQL 也会出现此异常。

【问题讨论】:

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


    【解决方案1】:

    从这里:https://entityframework.codeplex.com/workitem/2515
    EF 团队分类:这是因为您的身份配置了 TPC 映射。因为这两种类型映射到完全不同的表,所以您会得到重复的 ID,因为数据库不知道在两个表之间生成唯一值。解决此问题的一种方法是修改表格,使其一个生成奇数,另一个生成偶数。 解决方法。

    我们为所有实体创建具有共享属性的接口,并从 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
    {
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多