2014-09-22 51 views
1

我使用Oracle EF 5.0提供程序。 Oracle 11G數據庫。 這是我的數據庫模式: Database scheme
context.SaveChanges()與oracle實體框架中的無效操作異常5

表中有一個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可能處於不一致的狀態。內部異常消息:由於對象的鍵值與ObjectStateManager中的另一個對象衝突,因此AcceptChanges無法繼續。在調用AcceptChanges之前確保鍵值是唯一的。

但更改正確保存在數據庫中。而且我的Title對象有正確的標題Id和Title_Name。我能做什麼?或者我做錯了什麼?

Opps。我從edmx中刪除繼承,錯誤消失!...

但是所有的項目都是建立在繼承!

Ops。具有相同方案的MS SQL也給出了這個例外。

回答

0

從這裏:https://entityframework.codeplex.com/workitem/2515
EF團隊分流:這是因爲你有一個TPC映射配置的標識。由於這兩種類型映射到完全獨立的表,因此您將獲得重複的ID,因爲數據庫不知道在兩個表之間生成唯一值。解決這個問題的方法之一是修改表格,使其生成奇數,另一個生成偶數。 解決方法。

我們爲所有實體創建具有共享屬性的接口,並從edmx文件中刪除繼承。
I.e.

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

,因此,我們可以使用通用的版本在我們的項目中的所有實體。