2011-12-27 2 views
11

Y a-t-il un moyen intégré de supprimer avec Linq to Entites, en utilisant la clé primaire.Linq to Entities supprimer

Actuellement m travail autour de créer une procédure stockée appelée DeleteTable (table étant le nom de la table)

puis en C# LINQ to Entities Je ne juste context.DeleteTable (ID)

Est-ce meilleur moyen? Quelles autres options y a-t-il?

Répondre

11

Si vous ne souhaitez pas accéder à la base de données pour récupérer tous les champs de l'objet, vous pouvez créer une nouvelle instance de la classe, l'attacher à un nouveau contexte, l'enlever et enregistrer les modifications. Cela permet à EF de générer la commande de suppression appropriée.

using (var context = new MyContext()) 
{ 
    var myObject = new MyObject { ID = 3 }; 
    context.MyObjectSet.Attach(myObject); 
    context.MyObjectSet.DeleteObject(myObject); 
    context.SaveChanges(); 
} 

Remarque: ceci entraînera une exception si vous essayez de supprimer un objet qui n'existe pas. C'est seulement approprié si vous êtes sûr que l'objet existe.

Note 2: cela suppose que vous avez configuré vos entités afin que généré Supprimer de commande pas d'autres champs que l'ID (ce qui signifie pas de propriétés Horodatage, ou quelque chose de similaire qui seraient inclus dans la requête)

+0

Est-ce que cela fonctionne vraiment? Doux! Ça va être utile. +1 – BZink

+1

Cela fonctionne, mais j'aurais dû ajouter que cela ne fonctionne que si la commande delete générée par EF ne référence aucun autre champ que l'ID. Si vous avez un champ Horodatage, EF l'inclura dans la requête générée, mais comme il ne connaît pas la valeur à utiliser, la requête sera erronée. – hvd

5

La méthode par défaut consiste à interroger l'entité, puis à émettre la méthode .DeleteObject(...).

+1

serait-ce pas besoin de 2 voyages à la DB? – michael

+0

Oui. Si vous ne souhaitez pas mapper ou appeler des procédures stockées explicites, vous disposez d'options limitées. –

+0

@michael 'Attaching' n'a pas besoin d'un voyage? –

1

Utilisez la commande d'exécution à vos besoins hors du contexte tel que:

mycontext.ExecuteCommand("DELETE FROM MYTABLE"); 

ou

mycontext.ExecuteCommand("TRUNCATE TABLE MYTABLE"); 

HTH

+0

Existe-t-il une méthode ExecuteCommand disponible pour Link to Entites? ou est-ce seulement Link to SQL? – michael

+0

Mon mauvais. voir ExecuteStoreQuery for EF. Voir Comment: Exécuter directement des commandes contre la source de données (http://msdn.microsoft.com/en-us/library/ee358769.aspx) HTH – OmegaMan

+0

Merci, je n'ai jamais su que je pourrais le faire directement à partir du lien aux entités. – michael

2

Vous pouvez utiliser le DbSet<T>.Remove(entity) (version 4.1, 4.2) ou EntitySet<T>.Remove(entity) (Version 1.0, 4.0) méthodes:

YourDbContext.Table.Remove(entityObject); 
+0

Encore une fois, je pense que vous devez sélectionner l'entité avant de pouvoir le supprimer? donc 2 voyages .. Je suis mauvais? – michael

+0

Oui, vous devez interroger l'entité, ou vous pouvez utiliser l'approche 'Attach', proposée par @hvd – Jan

2

J'utilise pour rechercher le (s) article (s) à supprimer, puis le supprimer (eux) en utilisant la méthode DeleteObject.

Dim itemToDelete = (From u In db.SOME_TABLE Where u.ID = ID).FirstOrDefault 
db.SOME_TABLE.DeleteObject(itemToDelete) 
db.SaveChanges() 

utiliser ceci à l'intérieur d'un bloc catch try

+0

isnt ceci faisant 2 voyages à la DB? (c'est-à-dire sélectionner * à partir de some_Table où id = Id) puis (supprimer foo de some_table où ..)? – michael

+0

Oui, mais si vous ne voulez pas faire 2 allers-retours à la base de données vous utilisez SP, mais vous mappez les commandes Insérer, Mettre à jour et Supprimer à SP, si vous n'en mappez aucune, vous obtiendrez une exception UpdateException. – Piyey