如何在不加载所有数据的情况下删除实体框架中的多对多关系

时间:2009-04-16 16:55:55

标签: entity-framework ado.net many-to-many

有没有人知道如何删除ADO.NET实体框架中的多对多关系而无需加载所有数据?在我的情况下,我有一个实体主题,其属性订阅,我需要删除一个订阅。代码 myTopic.Subscriptions.Remove(...)有效,但我需要先加载所有订阅(例如 myTopic.Subscriptions.Load()),我不会我想这样做,因为订阅有很多(我的意思是很多)。

5 个答案:

答案 0 :(得分:27)

你可以附上()订阅然后删除()它 - 注意,我们这里没有使用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

所以它不会在任何时候提取所有订阅。

答案 1 :(得分:4)

这是在不先加载任何数据的情况下删除的方法。这适用于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(); 

答案 2 :(得分:2)

一种方法是使用存储过程直接删除数据库中的子记录并将其包含在EF模型中;然后从DataContext中调用它。

答案 3 :(得分:1)

这是我的例子......我知道外键,我不想做db往返。
我希望这有助于某人...

鉴于


[客户]< ---多对多---> [用药]

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

答案 4 :(得分:-1)

如果设置了外键,则在删除父实体时,应通过DBMS自动自动执行参照完整性

如果您首先使用代码,据我在MVA教程中所了解, ON DELETE CASCADE 是EF6设置的默认行为。如果首先运行DB,您应该更改您的子表...

以下是链接:https://mva.microsoft.com/en-US/training-courses/implementing-entity-framework-with-mvc-8931?l=pjxcgEC3_7104984382视频中, 20:00 以及幻灯片演示文稿中提及第14页< /强>

干杯