update many framework foreign first false deletebehavior delete code attribute entity-framework cascading-deletes

entity-framework - foreign - entity framework many to many



Eliminaciones en cascada con Entity Framework-Entidades relacionadas eliminadas por EF (2)

Tengo un problema con la eliminación en Entity Framework. En resumen, EF explícitamente intenta eliminar una entidad de la base de datos a pesar de que he configurado explícitamente EF para usar eliminaciones en cascada en la base de datos.

Mi diseño:

Tengo tres tipos de entidades, MainEntity , EntityTypeA y EntityTypeB . EF se ha configurado para usar eliminación de cascada al eliminar EntityTypeA y EntityTypeB . En otras palabras, si MainEntity una instancia de MainEntity , quiero que todas las EntityTypeA relacionadas EntityTypeA y EntityTypeB se eliminen. Nunca borro EntityTypeA o EntityTypeB sin borrar también su padre.

Mi problema es que EF emite explícitamente una declaración DELETE para EntityTypeA , lo que hace que la aplicación se cuelgue.

Así es como se ve mi modelo:

Las relaciones tienen la siguiente configuración no predeterminada:

  • MainEntity -> EntityTypeA OnDelete: Cascade
  • MainEntity -> EntityTypeB OnDelete: Cascade

La relación EntityTypeA -> EntityTypeB tiene OnDelete: None

Contenidos de la base

INSERT INTO MainEntities (Name) values (''Test'') insert into EntityTypeA (MainEntityID) VALUES (1) insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1) insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)

Mi código:

class Program { static void Main(string[] args) { var context = new Model1Container(); var mainEntity = context.MainEntities.Include("EntityTypeA").SingleOrDefault(); context.DeleteObject(mainEntity); context.SaveChanges(); } }

Lo que pasa

Cuando llamo SaveChanges, Entity Framework ejecuta lo siguiente en la base de datos:

exec sp_executesql N''delete [dbo].[EntityTypeA] where ([Id] = @0)'',N''@0 int'',@0=1

Esto provoca una violación de clave externa, porque hay elementos en la tabla de EntityTypeB que hace referencia a las instancias de EntityTypeA.

Pregunta

¿Por qué Entity Framework emite una eliminación explícita para la instancia de EntityTypeA a pesar de que he configurado Entity Framework para usar eliminaciones en cascada? Si elimino el Include ("EntityTypeA"), vuelve a funcionar.


En lugar de en el diseñador EF, también se puede establecer la eliminación en cascada en las Restricciones de FK en la base de datos.

Estos son los pasos visuales de Sql Server Management Studio (SSMS) sobre cómo configurar las eliminaciones en cascada.

Tenga en cuenta cuando termine , no olvide actualizar el edmx en la base de datos antes de intentar una eliminación.

Discuto esto con más profundidad en mi blog: Entity Framework Cascading Deletes; Establecerlo desde la base de datos.


Esto es exactamente cómo se comportan las eliminaciones en cascada en EF. Configurar Cascade en una relación en EF Designer instruye a EF para que ejecute la instrucción DELETE para cada entidad cargada realated. No dice nada sobre ON CASCADE DELETE en la base de datos.

Configurar la eliminación de Cascade cuando se usa EF necesita dos pasos:

  • Establecer la relación de Cascade en el diseñador de EF. Este contexto de instrucciones indica que todas las entidades relacionadas cargadas deben eliminarse antes de eliminar la entidad principal. Si esto no sucede, EF emitirá una excepción porque el estado interno detectará que los elementos secundarios cargados no están relacionados con ninguna entidad principal existente, incluso si se requiere la relación. No estoy seguro de si esto sucede antes de la ejecución de la declaración de eliminación de la entidad padre o después, pero no hay diferencia. EF no vuelve a cargar las entidades relacionadas después de ejecutar modificaciones por lo que simplemente no sabe acerca de las eliminaciones en cascada desencadenadas en la base de datos.
  • Establezca ON CASCADE DELETE en la relación en la base de datos. Esto le indicará a SQL que elimine todos los registros relacionados que no fueron cargados al contexto en el momento de eliminar el padre.

La implementación de eliminaciones en cascada en EF es extraña y bastante ineficiente, pero así es como se comporta y, si desea usarla, debe modificar su aplicación para que se comporte correctamente en este escenario.