Cómo eliminar una relación de muchos a muchos en Entity Framework sin cargar todos los datos

ado.net entity-framework many-to-many

Pregunta

¿Alguien sabe cómo eliminar una relación de muchos a muchos en ADO.NET Entity Framework sin tener que cargar todos los datos? En mi caso, tengo un tema de entidad que tiene una propiedad Suscripciones y necesito eliminar una sola suscripción. El código myTopic.Subscriptions.Remove (...) funciona pero primero debo cargar todas las suscripciones (por ejemplo, myTopic.Subscriptions.Load () ) y no quiero hacerlo porque hay muchos (y quiero decir muchos) de suscripciones.

Respuesta aceptada

Puede Adjuntar () una suscripción y luego Eliminar (), tenga en cuenta que no estamos usando Add (), solo Adjuntar, así que efectivamente le estamos diciendo a EF que sabemos que el objeto está conectado a la tienda y se lo pedimos. comportarse como si eso fuera cierto.

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

Todo este intercambio, incluido el tema original de la base de datos, envía estas 3 consultas a la base de datos:

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

así que no está tirando de todas las suscripciones en ningún momento.


Respuesta popular

Así es como eliminar sin cargar primero ningún dato. Esto funciona en EF5. No estoy seguro acerca de las versiones anteriores.

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

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow