2011-09-30 116 views
6

我第一次使用實體框架,我試圖用集合創建一個對象(並且我想要創建集合中的所有對象在數據庫中),但我有一些外鍵違規。實體框架一對多插入 - 違反外鍵

我的示例表:

table APPOINTMENTS: ID, VAR1, DATE_APPOINTMENT 
table GUESTS: ID, APPOINTMENT_ID, USER_ID, VAR2, VAR3 

我的測試代碼:

DomainService aux = new DomainService(); 

APPOINTMENTS appointment = new APPOINTMENTS(); 
appointment.VAR1 = "BLA"; 
appointment.DATE_APPOINTMENT = new DateTime(); 

//The user with id = 1 is already created in the database 
appointment.GUESTS.Add(new GUESTS { USER_ID = 1, VAR2 = 1, VAR3 = "F" }); 

aux.InsertAppointment(appointment); 

在我的DomainService有:

public void InsertAppointment(APPOINTMENTS appointment) 
{ 
    using (var context = this.ObjectContext) 
    { 
     context.AddToAPPOINTMENTS(appointment); 
     context.SaveChanges(); 
    } 
} 

但我發現了這個錯誤: {「ORA -02291:違反了完整性約束(FK_GUESTS_APPOINTMENTS) - 未找到父鍵「}

我在做什麼錯?

UPDATE: 要創建在數據庫中的ID,我使用的每個表中序列和插入前觸發器來獲取下一個值。 當我創建單個對象時,例如沒有客人的約會,它會插入到數據庫中,並生成ID。

+0

我有整整做在EF中也是這樣,它適用於我。兩個表中的主鍵都是自動編號。我正在使用sql server的數據存儲 –

+0

我在插入前使用序列和觸發器...當我嘗試創建一個沒有guest的約會時,它會生成一個ID,當我嘗試使用現有的約會ID創建一個guest時,它也能正常工作 – Canastro

+0

@MuhammadAdeelZahid他使用的是Oracle,而不是SQL Server –

回答

4

的解決了這個問題:

"The ID fields that are generated from sequences won't be handled correctly. After saving the entities the ID's will be returned as 0. I'll fix this by manually hacking the SSDL (open your .edmx file in a text editor) with StoreGeneratedPattern="Identity" attributes on the ID fields (lines 6 and 16). Note that designer may rip that change out upon future modification.

While I suppose it's not absolutely necessary it might also be prudent to modify some type metadata such as changing "number"s to "int"s in your SSDL and "Decimal"s to "Int32"s in your CSDL where applicable. Frequently these don't auto-generate with the desired values especially with XE."

@http://www.chrisumbel.com/article/oracle_entity_framework_ef

+0

<的EntityType名稱= 「窗口小部件」> <屬性名= 「爲widgetid」 StoreGeneratedPattern = 「同一性」 類型= 「數字」 可爲空= 「假」精度=「8」/> –

0

我不知道你在哪裏設置你的主鍵(約會類的ID屬性)。你在數據庫端使用密鑰生成器嗎?如果不是這應該是問題。

+0

我正在使用序列在插入前獲取下一個值的觸發器。 – Canastro

-1

您插入的記錄中的外鍵值在約束返回的父表中找不到。

+1

那麼,是不是要實體框架插入約會和客戶與正確的APPOINTMENT_ID FK? – Canastro

+0

我不是一個java程序員,所以我不知道你的實體框架做了什麼或不做什麼。如果框架應該首先插入父項,那麼是否有可能有更多的設置可以爲您的對象執行?查看你的代碼,如果我正確地閱讀它,你在APPOINTMENT之前創建了GUEST,而GUEST.APPOINTMENT_ID是外鍵返回到APPOINTMENT.APPOINTMENT_ID。在創建GUEST對象時,是否在APPOINTMENT_ID = 1的APPOINTMENT表中有記錄? –

+0

發現了這個問題。這是一個映射問題...您需要對生成的映射進行一些更改才能做到這一點。 EF不喜歡的Oracle的xD – Canastro

1

對於我來說,這個問題是通過打開圖的.edmx根本解決,將每個主鍵中的屬性StoreGeneratedPattern從None更改爲Identity。保存一切後都很好。

我使用VS 2012,實體框架5(6尚不支持),甲骨文11.2,去年12 ODP.NET,.NET 4.5

1

在EF代碼第一種方法的情況下,如果這個錯誤來

(ORA-02291: integrity constraint (FK_GUESTS_APPOINTMENTS) violated - parent key not found)

在我的情況下有兩個表有標識列。於是我就加入

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

屬性略高於列我的模型類,這是在數據庫中標識列,它解決了我的問題:)

希望這有助於:)