2011-09-30 9 views
6

私はEntity Frameworkを初めて使用しています。コレクションを使用してオブジェクトを作成しようとしています(コレクションのすべてのオブジェクトを作成したいデータベースでも同様ですが)私はいくつかの外部キー違反を持っています。エンティティフレームワークの1対多の挿入 - 外部キー違反

私のサンプル表:

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

私のテストコード:のDomainServiceで

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); 

私が持っている:

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

しかし、私はこのエラーを取得しています: { "ORA -02291:整合性制約(FK_GUESTS_APPOINTMENTS)違反 - 親キーが見つかりません "}

私は間違っていますか?

UPDATE: IDをデータベースに作成するには、挿入する前に各テーブルのシーケンスとトリガーを使用して次の値を取得しています。 1つのオブジェクトを作成すると、ゲストなしのアポイントメントは、データベースに挿入され、IDを生成します。

+0

私は正確に行っている上に、私のモデルクラスに

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

プロパティを追加しましたEFと同じことは私のために働く。両方のテーブルのプライマリキーは自動番号です。私はデータストレージのためのSQL Serverを使用しています –

+0

私はシーケンスと挿入前にトリガを使用しています...ゲストなしでアポイントメントを作成しようとするとIDが生成され、既存のappointmentIDを持つゲストを作成しようとすると正しく動作します – Canastro

+0

@MuhammadAdeelZahid彼はSQL ServerではなくOracleを使用しています –

答えて

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:私として

+0

を好きではない <プロパティ名= "widgetIdが" StoreGeneratedPattern = "アイデンティティ" タイプ= "数" のNullable = "false" Precision = "8" /> –

0

プライマリキー(アポイントクラスのIDプロパティ)を設定する場所が表示されません。データベース側で鍵生成器を使用していますか?そうでない場合、これが問題になるはずです。

+0

シーケンスと挿入前に次の値を取得するトリガー。 – Canastro

-1

制約が参照する親テーブルに見つからない外部キー値を持つレコードを挿入しようとしています。

+1

さて、Entity Frameworkに、予定と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

//www.chrisumbel.com/article/oracle_entity_framework_ef、問題は図.edmxを開くことによって、単純に解決されたとStoreGeneratedPatternプロパティを各テーブルの各主キーのNoneからIdentityに変更します。すべてを保存した後は問題ありませんでした。

私はVS 2012を使用しています、Entity Frameworkの5(6はまだサポートされていない)は、Oracle 11.2、最後のODP.NET 12、EFコード最初のアプローチの場合で、.NET 4.5

1

は、このエラーが来れば

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

私のケースでは、ID列を持つ2つのテーブルがあります。だから、僕はただ、データベース内のID列であり、それは私の問題を解決し、カラム:)

・ホープ、この助け:)

関連する問題