Les suppressions en cascade avec Entity Framework entités Liées à supprimé par EF
J'ai un problème avec la suppression dans le Cadre de l'Entité. En bref, EF explicitement essaie de supprimer une entité à partir de la base de données, même si j'ai explcitly configuré EF utiliser les suppressions en cascade dans la base de données.
Ma conception:
J'ai trois types d'entité, MainEntity
, EntityTypeA
et EntityTypeB
. EF a été configuré pour l'utilisation en cascade la suppression lors de la suppression de EntityTypeA
et EntityTypeB
. En d'autres termes, si je supprime une instance de MainEntity
, je veux tous liés EntityTypeA
et EntityTypeB
cas être supprimé. Je n'ai jamais supprimer EntityTypeA
ou EntityTypeB
sans également la suppression de leur parent.
Mon problème est que EF explicitement les questions un DELETE
déclaration pour EntityTypeA
, ce qui provoque mon application crash.
C'est ce que mon modèle de ressembler à:
Les relations de non-config par défaut:
MainEntity -> EntityTypeA OnDelete: Cascade
MainEntity -> EntityTypeB OnDelete: Cascade
La relation EntityTypeA -> EntityTypeB
a OnDelete: None
Base de données de contenu
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)
Mon code:
class Program
{
static void Main(string[] args)
{
var context = new Model1Container();
var mainEntity = context.MainEntities.Include("EntityTypeA").SingleOrDefault();
context.DeleteObject(mainEntity);
context.SaveChanges();
}
}
Ce qui se passe
Quand je l'appelle SaveChanges, Entity Framework exécute les opérations suivantes dans la base de données:
exec sp_executesql N'delete [dbo].[EntityTypeA]
where ([Id] = @0)',N'@0 int',@0=1
Ce qui provoque une violation de clé étrangère, parce qu'il y a des éléments dans EntityTypeB table du référencement EntityTypeA instances.
Question
Pourquoi ne Entity Framework question explicite pour supprimer l'instance de EntityTypeA, même si j'ai configuré Entity Framework à utiliser les suppressions en cascade? Si je supprime la fonction include("EntityTypeA"), il commence à travailler à nouveau.
- L'image (de votre modèle) n'est pas disponible
Vous devez vous connecter pour publier un commentaire.
C'est exactement comment les suppressions en cascade se comporte en EF. Réglage Cascade sur une relation en EF designer charge EF exécuter
DELETE
déclaration pour chaque chargé liée entité. Il ne dit rien sur leON CASCADE DELETE
dans la base de données.Réglage en Cascade la suppression lors de l'utilisation de l'EF a besoin de deux étapes:
ON CASCADE DELETE
sur la relation dans la base de données. Cela donnera des instructions SQL pour supprimer tous les enregistrements liés qui n'ont pas été chargés de contexte dans le temps de la suppression de la mère.La mise en œuvre de la cascade supprime l'EF est étrange et tout à fait inefficace, mais c'est comment il se comporte et si vous voulez l'utiliser, vous devez modifier votre application se comporte correctement dans ce scénario.
Au lieu de sur l'EF designer, on peut également régler cascade de suppression portant sur les Contraintes FK dans la base de données.
Voici les étapes visuelles à partir de Sql Server Management Studio (SSMS) sur la façon de configurer les suppressions en cascade.
Remarque lorsque vous avez terminé, n'oubliez pas de mise à jour de l'edmx sur la base de données avant d'essayer de le supprimer.
Je discuter plus en profondeur sur mon blog: Entity Framework Suppressions en Cascade; Ensemble de la base de données.