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