Хорошо, я переписал вашу функцию вывода. Это выглядит грубо, но это работает
void storeOutput (Node * nod, std::string & str, int p)
{
p++;
for (int x = 0; x < p; x++)
{
str += " ";
}
str += nod->name;
str += "\n";
for (int x = 0; x < p; x++)
{
str += " ";
}
str += "{ \n";
if (nod->children.size () > 0)
{
for (auto & n:nod->children)
{
storeOutput (n, str, p);
for (int x = 0; x < p + 1; x++)
{
str += " ";
}
str += "} \n";
p--;
}
}
}
Вы можете прикрепить () подписку, затем удалить () ее - обратите внимание, мы не используем Add () здесь просто Attach, так эффективно мы говорим 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
, поэтому она не вытягивает все подписки в любой момент.
Один из способов - сохранить сохраненный процесс, который будет удалять ваши дочерние записи непосредственно в БД и включать его в ваш Модель EF; затем просто позвоните из вашего DataContext.
Вот мой пример ... где мне известны внешние ключи, и я не хочу выполнять обход базы данных туда и обратно.
Надеюсь, это кому-то поможет ...
Дано:
[client] <--- многие-ко-многим ---> [Лекарство]
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();