2012-01-25 44 views
12

Tengo un problema con la eliminación de filas relacionadas en Entity Framework 4.1. Tengo tablas con relacionesEntity Framework en eliminar cascada

Libro 1 < ---> * BookFormats

he puesto en la supresión en cascada: la propiedad

ALTER TABLE [dbo].[BookFormats] WITH CHECK ADD CONSTRAINT [FK_BookFormats_Book] 
FOREIGN KEY([BookID]) REFERENCES [dbo].[Book] ([BookID]) on delete cascade 

El EDMX

enter image description here

Entonces , Quiero eliminar todos los artículos BokFormats relacionados con mi objeto Book:

var originalBook = m.db.Book.First(x => x.BookID == bookId); 
originalBook.BookFormats.Clear(); 
m.db.SaveChanges(); 

Pero, me sale el error:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

me acabaron las ideas sobre cómo eliminar estos objetos. ¿Algunas ideas?

Respuesta

10

cascada eliminaciones concepto es el siguiente:

Cuando se elimina Book de la BD todo relacionado BookFormats serán eliminados para usted por SQL Server (tenga en cuenta que no importa cómo se inició a través de la eliminación de Book EF o SQL sin procesar). Por lo tanto, no tiene nada que ver con su tarea: "Quiero eliminar todos BookFormats relacionados con mi Book". Para lograrlo se necesita algo como esto:

foreach(var m in m.db.BookFormats.Where(f=>f.BookID == bookID)) 
{ 
    m.db.BookFormats.Remove(m); 
} 
m.db.SaveChanges(); 
4

no está eliminando la BookFormats de la base de datos, pero va a extraer la relación, por lo que su orpahning BookFormats y el establecimiento de la columna de la BookID-NULL. La cascada de eliminación que ha puesto en la base de datos dice When I delete the Libro , then delete all of the BookFormats that have a BookID equal to mine. No está eliminando el libro que está eliminando los formatos del Book.

En lugar de originalBook.BookFormats.Clear() usted debe tener algo como esto ...

List<int> idsToDelete = new List<int>(); 

foreach (BookFormat bf in originalBook.BookFormats) 
{ 
    idsToDelete.Add(bf.ID); 
} 

foreach (int id in idsToDelete) 
{ 
    BookFormat format = m.db.BookFormat.FirstOrDefault(x => x.ID == id); 
    if (format != null) 
    { 
     m.db.DeleteBookFormat(format); 
    } 
} 

m.db.SaveChanges(); 

Debe ser algo por el estilo. No estoy frente a mí para recordar cómo EF construye el método de eliminación en el EDMX.

+0

bien, entonces me sale el error: La colección se modificó; la operación de enumeración no se puede ejecutar. – Tony

+0

@Tony, verifique el cambio al código. No es la manera más bonita, pero hace el trabajo. – bdparrish

14

Puede utilizar removeRange:

m.db.BookFormats.RemoveRange(originalBook.BookFormats); 
m.db.SaveChanges(); 

pero esto es para EF 6,0

+1

Sí. Es un ejemplo en RemoveRange.Pero editaré la publicación para no confundir algunos. Gracias. – Saykor

0

utilizo EF6 y esto funciona.

 var itemBinding = db.ItemBinding.Where(x => x.BindingToId == id) ; 
     foreach (var ib in itemBinding) 
     { 
      db.Item.Remove(ib.Item); 
      db.ItemBinding.Remove(ib); 
     } 
     db.SaveChanges(); 
+0

EF 7 no ha sido lanzado. EF 6.1 es la última versión estable. – MEMark

0

Lo he probado en EF 6.1.3 y esto debería funcionar bien:

var originalBook = m.db.Book.First(x => x.BookID == bookId); 
originalBook.BookFormats.Clear(); 
db.Books.Remove(originalBook); 
m.db.SaveChanges(); 
Cuestiones relacionadas