2009-05-30 10 views
4

J'utilise l'Entity Framework Ado.Net avec ASP.NET MVC.ADO.NET Entity Framework: Comment obtenir des suppressions automatiques en cascade?

Dans mon MSSQL 2008 Base de données J'ai par exemple les tables simplifiées et les relations suivantes:

(Song) 1--* (Version) 1 -- 1 (VersionInfo) 

Est-il possible d'avoir automatiquement les versions liées et leur supprimés de VersionInfo quand je supprimer un morceau?

Actuellement, je me sers quelque chose comme le code suivant, ce qui est beaucoup de travail manuel, étant donné que certaines tables ont jusqu'à 8 relations et ces relations ont sous-relations aussi parfois:

db = new Database() //Entities 
    Song song = db.Song.First(); 

    Song.Version.Load(); 

    foreach(Version version in Song.Version.ToList()) 
    { 
     //Remove Song-Version Reference. 
     song.Version.Remove(version); 


     //Get The VersionInfo so we can delete it after we deleted the Version object. 
     version.VersionInfoReference.Load(); 
     VersionInfo versionInfo = version.VersionInfo; 

     //Now we can delete the Version Object. 
     db.DeleteObject(version); 
     //Now we can also delete the versionInfo, since the reference is gone. 
     db.DeleteObject(versionInfo); 

    } 

    db.DeleteObject(song); 

Il doit y avoir un moyen plus facile façon d'obtenir des suppressions en cascade. J'ai déjà essayé de définir le paramètre de relation dans MSSQL à Cascade lors de la suppression, mais cela n'a rien changé ... Ai-je manqué quelque chose?

De toute façon, comment d'autres personnes résolvent ce problème?

Répondre

2

Vous ne devriez pas le faire dans Entity Framework. Toutes les bases de données relationnelles populaires prennent en charge ON CASCADE DELETE sur les clés étrangères, ce qui est également beaucoup plus efficace. Je vous suggère d'aller avec ça.

Il apparaît dans votre cas que vous devrez peut-être cascader les suppressions dans la chanson à la version et les supprimer dans la version à l'information de version. Il suffit de charger le concepteur de table dans SQL Manager et vous devriez voir les options pertinentes sous les relations. Dans la RTM de EF, sélectionnez une relation dans le concepteur, appuyez sur F4 pour voir les propriétés.

0

Si vous le définissez correctement dans la base de données, il devrait définitivement éliminer les suppressions. Je pense qu'ils ont amélioré cela dans la prochaine version de Entity Framework mais je n'en suis pas certain. Je me souviens juste d'avoir vu une cascade quelque part. Je vous recommande de revoir la base de données.

Par exemple, existe-t-il d'autres relations qui doivent également être mises en cascade?

1

Je l'ai essayé avec une base de données plus simple, 2 tables, et a découvert que la cascade est seulement du côté 1 d'un 1-many.

table A 
id - int 
b_id - int 

table B 
id - int 

La relation est définie entre A.b_id et B.id. La règle d'effacement est en cascade.

Lorsque je supprime A, B n'est pas supprimé. Lorsque je supprime B, A est supprimé.

Le problème est, je veux avoir B supprimé quand je supprime A. Je suppose que c'est seulement possible manuellement.

+0

Yep. Si vous supprimez A, B peut toujours exister sans problème. Mais si vous supprimez B, alors A ne peut pas exister (car il pointe vers B, qui n'existe plus). Les suppressions en cascade ne se produisent que lorsque la suppression d'un élément (B) entraîne un autre élément (A) incorrect ou enfreint une contrainte de clé étrangère. – Flater

0

vous verrez deux propriétés OnDelete (une pour chaque côté de la relation) définie sur "none". vous pouvez régler l'un ou l'autre côté pour "cascade" (je pense que vous devez le mettre sur le parent)

Questions connexes