net - Cómo eliminar la relación muchos a muchos en Entity Framework sin cargar todos los datos
how to use entity framework in mvc (5)
Puede Adjuntar () una suscripción y luego Eliminar () - tenga en cuenta, no estamos usando Agregar () aquí, solo Adjunte, de modo que efectivamente le estamos diciendo a EF que sabemos que el objeto está adjunto en la tienda, y pidiéndole que lo haga. compórtate 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
Este intercambio completo, que incluye obtener 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á sacando todas las suscripciones en ningún momento.
¿Alguien sabe cómo eliminar la 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 suscripción única. El código myTopic.Subscriptions.Remove (...) funciona pero necesito cargar todas las suscripciones primero (por ej., MyTopic.Subscriptions.Load () ) y no quiero hacer eso porque hay muchas (y me refiero a muchas) de suscripciones.
Aquí está mi ejemplo ... donde conozco las claves foráneas y no quiero hacer un DB de ida y vuelta.
Espero que esto ayude a alguien...
Dado:
[cliente] <--- muchos-a-muchos ---> [Medicación]
Client objClient = new Client() { pkClientID = pkClientID };
EntityKey entityKey = _commonContext.CreateEntityKey("Client", objClient);
objClient.EntityKey = entityKey;
_commonContext.Attach(objClient); //just load entity key ...no db round trip
Medication objMed = new Medication() { pkMedicationID = pkMedicationID };
EntityKey entityKeyMed = _commonContext.CreateEntityKey("Medication", objMed);
objMed.EntityKey = entityKeyMed;
_commonContext.Attach(objMed);
objClient.Medication.Attach(objMed);
objClient.Medication.Remove(objMed); //this deletes
_commonContext.SaveChanges();
Una forma sería tener un proceso almacenado que elimine los registros de su hijo directamente en el DB e incluirlo en su modelo EF; entonces solo llámalo desde tu DataContext.
Esta es la forma de 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();
Si se establecen las claves externas, la integridad referencial debería realizarse automáticamente a través del propio DBMS al eliminar las entidades padre.
Si usa el código primero, por lo que aprendí en un tutorial de MVA, ON DELETE CASCADE es el comportamiento predeterminado establecido por EF6. Si ejecuta DB primero, debe modificar su childtable (s) ...
Aquí está el enlace: https://mva.microsoft.com/en-US/training-courses/implementing-entity-framework-with-mvc-8931?l=pjxcgEC3_7104984382 En el video se menciona a las 20:00 en adelante y en la presentación de diapositivas se dice en la página 14 .
Aclamaciones