12

Estoy utilizando EF 4 STE para modelar un objeto Attachment. El Adjunto contiene un nombre, una descripción, una fecha y, lo más importante, datos (byte[]). Para optimizar la carga, no quiero recuperar la propiedad Datos hasta que sea absolutamente necesario, es decir, cuando el usuario haga clic en Download desde el cliente.Entity Framework Split Table Delete

En un esfuerzo por seguir este enfoque, utilicé la técnica de división de tablas descrita en here. Divido mi tabla de Attachment en Attachment (Nombre, Descripción, Fecha) y AttachmentData (Datos). Es una relación de 1 a 1 en mi modelo EF. Todo funciona bien hasta que intento eliminar un Adjunto sin el AttachmentData (es decir, attachment.AttachmentData == null). Obtengo la siguiente excepción:

Datos inválidos encontrados. Una relación requerida falta. Examine StateEntries para determinar el origen de la violación de restricción.

vi un similar post, pero me parece que no puede hacer que funcione con STE y el método de ApplyChanges extensión.

Ahora mi código de acceso a datos es simple: llamo al contexto ApplyChanges() seguido de SaveChanges().

He intentado con una función de eliminación de SQL simple y la correlacioné con ambas entidades y eso realmente funcionó; sin embargo, rompió el inserto. Parece que no puedo mapear una función de inserción para todas las propiedades de ambas entidades.

¿Alguna idea sobre otras opciones que puedo probar? ¿Puede la relación entre Attachment y AttachmentData ser opcional? Cuando lo hago de 1 a 0+, aparece un error de asignación que dice Their primary keys may collide.

Abierto a cualquier sugerencia.

Gracias!

Respuesta

6

La solución es similar a la pregunta vinculada pero hay que usar la función específica de las ECE - ApplyChanges:

context.Attachments.ApplyChanges(att); 
if (context.ObjectStateManager.GetObjectStateEntry(att).State == EntityState.Deleted) 
{ 
    var data = new AttachmentData() {Id = att.Id}; 
    context.AttachmentDataSet.Attach(data); 
    context.AttachmentDataSet.DeleteObject(data); 
} 
context.SaveChanges(); 
+0

Muchísimas gracias por la respuesta! ¡Funciona genial! –

+0

Esto es lo que me desconcierta profundamente: ¿por qué EF no puede darse cuenta de que, dado que las entidades se almacenan en la misma tabla, eliminar una de ellas también eliminará la otra? ¿Por qué necesitas cargarlo? –

+1

@FyodorSoikin: Supongo que porque nadie ha implementado esa función todavía. –