2011-09-30 11 views
6

Sto utilizzando Entity Framework per la prima volta e sto provando a creare un oggetto con una raccolta (e voglio che tutti gli oggetti nella raccolta siano creati nel database pure) ma sto avendo alcune violazioni delle chiavi esterne.Inserimento di entità da uno a molti Inserisci - Violazione di chiave esterna

mie tabelle di esempio:

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

mio codice di prova:

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

A DomainService ho:

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

Ma sto ottenendo questo errore: { "ORA -02291: violazione dell'integrità (FK_GUESTS_APPOINTMENTS) violata - chiave genitore non trovata "}

Cosa sto sbagliando?

UPDATE: Per creare l'ID del nel database, sto usando una sequenza per ogni tabella e un trigger prima di inserto per ottenere il valore successivo. Quando creo un singolo oggetto, ad es. un appuntamento senza ospiti, si inserisce nel database e genera l'id.

+0

ho fatto esattamente la stessa cosa in EF e funziona per me. Le chiavi primarie in entrambe le tabelle sono numeri automatici. Sto usando SQL Server per l'archiviazione dei dati –

+0

Sto usando sequenze e un trigger prima di inserire ...Quando cerco di creare solo un appuntamento senza ospiti genera un ID, e quando cerco di creare un ospite con un'appointmentID esistente funziona correttamente anche – Canastro

+0

@MuhammadAdeelZahid Lui sta usando Oracle, SQL Server non –

risposta

4

La soluzione a questo problema:

"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

0

Non riesco a vedere dove si sta impostando la chiave primaria (la proprietà ID della classe di appuntamento). Stai usando un generatore di chiavi sul lato del database? Se no questo dovrebbe essere il problema.

+0

sto usando una sequenza e un trigger che ottiene il valore successivo prima di inserirlo. – Canastro

-1

Si sta inserendo un record con un valore di chiave esterna non trovato nella tabella padre a cui il vincolo fa riferimento.

+1

Bene, non è presente il Entity Framework per inserire l'appuntamento e l'ospite con il curriculum APPOINTMENT_ID FK? – Canastro

+0

Non sono un programmatore java, quindi non ho idea di cosa funzioni o meno il framework delle entità. Se si suppone che il framework inserisca prima il genitore, è possibile che tu abbia più setup da fare per il tuo oggetto? Guardando il tuo codice, se lo sto leggendo, stai creando il GUEST prima del NOMINE, con GUEST.APPOINTMENT_ID che è la chiave esterna di APPOINTMENT.APPOINTMENT_ID. Durante la creazione dell'oggetto GUEST hai un record nella tabella APPUNTAMENTO con APPOINTMENT_ID = 1? –

+0

Trovato il problema. Era un problema di mappatura ... È necessario apportare alcune modifiche alla mappatura generata per essere in grado di farlo. EF non piace Oracle xD – Canastro

1

Quanto a me, il problema è stato risolto semplicemente aprendo diagramma .edmx e modifica della proprietà StoreGeneratedPattern da None a Identity per ogni chiave primaria in ogni tabella. Dopo aver salvato tutto andava bene.

Sto utilizzando VS 2012, Entity Framework 5 (6 non è ancora supportato), Oracle 11.2, ODP.NET ultimi 12, .Net 4.5

1

In caso di codice EF primo approccio, se questo errore venire

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

Nel mio caso ci sono 2 tabelle che hanno colonne Identity. Così ho solo aggiunto

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

proprietà alla mia classe del modello appena sopra la colonna che è colonna di identità nel database ed è risolto il mio problema :)

Spero che questo aiuto :)

Problemi correlati