So löschen Sie die Viele-zu-Viele-Beziehung in Entity Framework, ohne alle Daten zu laden

ado.net entity-framework many-to-many

Frage

Weiß jemand, wie Sie die Viele-zu-Viele-Beziehung in ADO.NET Entity Framework löschen können, ohne alle Daten laden zu müssen? In meinem Fall habe ich eine Entität Topic mit einer Eigenschaft Subscriptions und ich muss ein einzelnes Abonnement entfernen. Der Code myTopic.Subscriptions.Remove (...) funktioniert, aber ich muss zuerst alle Subskriptionen laden (z. B. myTopic.Subscriptions.Load () ). von Abonnements.

Akzeptierte Antwort

Sie können ein Abonnement anhängen () und dann ein Remove () -Objekt. Hinweis: Wir verwenden Add () hier nicht, sondern fügen an, so dass wir EF so effektiv mitteilen, dass wir wissen, dass das Objekt im Geschäft angehängt ist, und es darum bitten benimm dich, als ob das wahr wäre.

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

Der gesamte Austausch, einschließlich des Abrufs des ursprünglichen Themas aus der Datenbank, sendet diese 3 Abfragen an die Datenbank:

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

Es zieht also nicht alle Abonnements zu einem bestimmten Zeitpunkt ein.


Beliebte Antwort

So löschen Sie, ohne zuvor Daten zu laden. Das funktioniert in EF5. Nicht sicher über frühere Versionen.

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(); 


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum