Как удалить отношение «многие ко многим» в Entity Framework без загрузки всех данных

ado.net entity-framework many-to-many

Вопрос

Кто-нибудь знает, как удалить отношение многие ко многим в ADO.NET Entity Framework, не загружая все данные? В моем случае у меня есть объект Тема, который имеет свойство Подписки, и мне нужно удалить одну подписку. Код myTopic.Subscription.Remove (...) работает, но мне нужно сначала загрузить все подписки (например, myTopic.Subscription.Load () ), и я не хочу этого делать, потому что их много (и я имею в виду много) подписок.

Принятый ответ

Вы можете прикрепить () подписку, затем удалить () ее - заметьте, мы здесь не используем Add (), просто присоединяем, поэтому мы эффективно сообщаем EF, что знаем, что объект прикреплен в магазине, и просим вести себя так, как будто это правда.

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

Весь этот обмен, включая получение оригинальной темы из базы данных, отправляет эти 3 запроса в базу данных:

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

так что это не тянет все подписки в любой момент.


Популярные ответы

Это как удалить без предварительной загрузки каких-либо данных. Это работает в EF5. Не уверен насчет более ранних версий.

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

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow