Как удалить many-many отношения в Платформе Объекта, не загружая все данные

Хорошо, я переписал вашу функцию вывода. Это выглядит грубо, но это работает

 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--;
    }
    }
}
19
задан Brian Tompsett - 汤莱恩 2 July 2015 в 18:28
поделиться

3 ответа

Вы можете прикрепить () подписку, затем удалить () ее - обратите внимание, мы не используем 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

, поэтому она не вытягивает все подписки в любой момент.

27
ответ дан 30 November 2019 в 03:53
поделиться

Один из способов - сохранить сохраненный процесс, который будет удалять ваши дочерние записи непосредственно в БД и включать его в ваш Модель EF; затем просто позвоните из вашего DataContext.

2
ответ дан 30 November 2019 в 03:53
поделиться

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

Дано:
[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();
1
ответ дан 30 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: