Comment supprimer une relation plusieurs à plusieurs dans Entity Framework sans charger toutes les données

ado.net entity-framework many-to-many

Question

Quelqu'un sait-il comment supprimer une relation plusieurs à plusieurs dans ADO.NET Entity Framework sans avoir à charger toutes les données? Dans mon cas, j'ai une entité Sujet qui a une propriété Abonnements et je dois supprimer un seul abonnement. Le code myTopic.Subscriptions.Remove (...) fonctionne, mais je dois d'abord charger tous les abonnements (par exemple, myTopic.Subscriptions.Load () ) et je ne veux pas le faire car il y en a beaucoup (et je veux dire beaucoup). des abonnements.

Réponse acceptée

Vous pouvez joindre () un abonnement puis supprimer () - Remarque: nous n'utilisons pas Add () ici, mais simplement Attach, de sorte que nous disons à EF que nous savons que l'objet est attaché dans la boutique se comporter comme si c'était vrai.

var db = new TopicDBEntities();
var topic = db.Topics.FirstOrDefault(x => x.TopicId == 1);

// Get the subscription you want to delete
var subscription = db.Subscriptions.FirstOrDefault(x => x.SubscriptionId == 2);
topic.Subscriptions.Attach(subscription); // Attach it (the ObjectContext now 'thinks' it belongs to the topic)
topic.Subscriptions.Remove(subscription); // Remove it
db.SaveChanges(); // Flush changes

Tout cet échange, y compris l'obtention du sujet d'origine de la base de données, envoie ces 3 requêtes à la base de données:

SELECT TOP (1) 
[Extent1].[TopicId] AS [TopicId], 
[Extent1].[Description] AS [Description]
FROM [dbo].[Topic] AS [Extent1]
WHERE 1 = [Extent1].[TopicId]


SELECT TOP (1) 
[Extent1].[SubscriptionId] AS [SubscriptionId], 
[Extent1].[Description] AS [Description]
FROM [dbo].[Subscription] AS [Extent1]
WHERE 2 = [Extent1].[SubscriptionId]


exec sp_executesql N'delete [dbo].[TopicSubscriptions]
where (([TopicId] = @0) and ([SubscriptionId] = @1))',N'@0 int,@1 int',@0=1,@1=2

donc, il ne tire pas tous les abonnements à un moment donné.


Réponse populaire

Voici comment supprimer sans charger aucune donnée. Cela fonctionne dans EF5. Pas sûr des versions précédentes.

var db = new TopicDBEntities();

var topic = new Topic { TopicId = 1 };
var subscription = new Subscription { SubscriptionId = 2};
topic.Subscriptions.Add(subscription);

// Attach the topic and subscription as unchanged 
// so that they will not be added to the db   
// but start tracking changes to the entities
db.Topics.Attach(topic);

// Remove the subscription
// EF will know that the subscription should be removed from the topic
topic.subscriptions.Remove(subscription);

// commit the changes
db.SaveChanges(); 


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow