2011-02-07 20 views
14

Tengo una entidad "Request" con una relación de 1 .. * con la entidad "RequestProperty". Entonces, hay una colección de objetos RequestProperty en "Solicitud". Cuando actualizo una "Solicitud", deseo eliminar todos los elementos en RequestProperty EntityCollection y agregar los nuevos elementos del objeto de dominio entrante. Cuando itero sobre la colección Request.Properties y llamo una eliminación o un DeleteObject en el artículo, la enumeración falla porque la colección se ha modificado.Entity Framework 4 Delete Object from entity collection

A partir de ahora estoy haciendo esto:

while (true) 
{ 
    if (newRequest.Properties.Count > 0) 
     context.RequestPropertySet.DeleteObject(newRequest.Properties.First()); 
    else 
     break; 
} 

Dado que esto no es realmente "cool" Creo que tiene que haber otra manera de vaciar una colección de una relación. Gracias por tus pensamientos.

Respuesta

19

La respuesta depende de la forma en que modeló sus entidades. Si está utilizando una relación independiente común o una relación de clave externa, tendrá que usar su enfoque actual; lo estoy usando también en mi proyecto.

Si definió la relación de identificación, podrá llamar a Clear en la recopilación como se describe en @Craig. La relación de identificación es una relación especial donde la clave primaria de la entidad dependiente contiene una clave externa de la entidad principal.

Example EF model

El ejemplo muestra Order entidad y OrderItem entidad con la clave externa identificación de relación entre ellos. La clave principal de OrderItem consiste en Id y OrderId únicos que son FK de la tabla Order. Con esta configuración no necesita iterar a través de OrderItem sy eliminar cada elemento por separado. Simplemente eliminando OrderItem de la colección se ejecutará como eliminar en la base de datos y la recopilación de borrado eliminará todos los OrderItem s relacionados en la base de datos.

+0

Estoy intentando utilizar esencialmente la misma estructura de modelo que Order <-association-> OrderItem anterior, sin éxito. Sigo recibiendo el siguiente error en tiempo de ejecución: Namespace.Models.OrderItem:: EntityType 'OrderItem' no tiene una clave definida. Defina la clave para este EntityType. OrderItem: EntityType: EntitySet 'OrderItems' se basa en el tipo 'OrderItem' que no tiene claves definidas. La principal diferencia es que no tengo ninguna propiedad que no sea clave en OrderItem. – user1003221

1

Utilice el método Clear():

newRequest.Properties.Clear(); 
+1

No funcionará, ya que la columna de clave externa en la tabla RequestProperty no admite valores NULL. Creo que podría cambiar eso y/o establecer una cascada en eliminar. – hoetz

+1

En este caso * debes * establecer una cascada en eliminar, en mi humilde opinión. –