2011-09-30 5 views
6

Estoy utilizando Entity Framework por primera vez y estoy intentando crear un objeto con una colección (y quiero que se creen todos los objetos de la colección) en la base de datos también), pero estoy teniendo algunas violaciones de claves extranjeras.Insertar uno a muchos de Entity Framework - Violación de clave externa

Mis tablas de ejemplo:

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

Mi código de prueba:

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

En DomainService tengo:

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

Pero estoy recibiendo este error: { "ORA -02291: restricción de integridad (FK_GUESTS_APPOINTMENTS) violada - clave principal no encontrada "}

¿Qué estoy haciendo mal?

ACTUALIZACIÓN: Para crear las identificaciones en la base de datos, estoy usando una secuencia para cada tabla y un gatillo antes de inserción para obtener el siguiente valor. Cuando creo un solo objeto, p. una cita sin invitados, se inserta en la base de datos y genera el id.

+0

que he hecho exactamente lo mismo en EF y funciona para mí. Las claves primarias en ambas tablas son números automáticos. Estoy usando el servidor sql para el almacenamiento de datos –

+0

Estoy usando secuencias y un disparador antes de insertar ...Cuando intento simplemente crear una cita sin invitados, genera una identificación, y cuando trato de crear un invitado con una cita ID existente, también funciona correctamente – Canastro

+0

@MuhammadAdeelZahid Está usando Oracle, no SQL Server –

Respuesta

4

La solución a este 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

No puedo ver dónde está configurando su clave principal (la propiedad de identificación de la clase de cita). ¿Estás usando un generador de claves en el lado de la base de datos? Si no, este debería ser el problema.

+0

Estoy usando una secuencia y un gatillo que obtiene el siguiente valor antes de insertar. – Canastro

-1

Está insertando un registro con un valor de clave externa que no se encuentra en la tabla padre a la que hace referencia la restricción.

+1

Bueno, ¿no es suponer el marco de la entidad para insertar la cita y el invitado con el currículum APPOINTMENT_ID FK? – Canastro

+0

No soy un programador de Java, así que no tengo idea de lo que hace o deja de hacer tu marco de trabajo de entidades. Si se supone que el marco debe insertar primero al padre, ¿es posible que tenga más configuración para su objeto? Al mirar su código, si lo estoy leyendo bien, está creando el INVITADO antes de la CITA, con GUEST.APPOINTMENT_ID como la clave externa de regreso a CITA.APPOINTMENT_ID. Al crear el objeto INVITADO, ¿tiene un registro en la tabla CITA CON APPOINTMENT_ID = 1? –

+0

Descubrió el problema. Era un problema de mapeo ... Necesita hacer algunas modificaciones en el mapeo generado para poder hacer esto. EF no le gusta Oracle xD – Canastro

1

cuanto a mí, el problema se solucionó simplemente abriendo diagrama .edmx y cambiar la propiedad StoreGeneratedPattern de None a Identity para cada clave principal en cada tabla. Después de guardar todo estuvo bien.

estoy usando VS 2012, Entity Framework 5 (6 no se admite todavía), Oracle 11.2, última ODP.NET 12, .Net 4.5

1

En el caso del código EF primera aproximación, si vienen este error

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

En mi caso, hay 2 tablas que tienen columnas Identity. Así que me acaba de agregar

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

propiedad a mi clase de modelo justo encima de la columna de la que es la columna de identidad en la base de datos y se solucionó mi problema :)

Esperanza esta ayuda :)

Cuestiones relacionadas