Удаление строк из коллекции с использованием ef-кода первым

#ef-code-first

#ef-code-first

Вопрос:

У меня есть следующая модель домена:

 public class Campaign
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Content> Content { get; set; }
}

public class Content
{
    public virtual long Id { get; set; }
    public virtual string Body { get; set; }
}
  

Это настроено:

 modelBuilder.Entity<Campaign>().HasMany(x => x.Content).WithOptional();
  

В моем сервисе у меня есть следующий код:

 Campaign campaign = campaignRepository.GetById(id);
  

Это загружает кампанию и все связанные элементы контента в коллекцию, что здорово. Проблема связана со следующим кодом:

  campaign.Name = "new value";
 campaign.Content.Clear();

 unitOfWork.Commit();
  

При этом строки содержимого из базы данных не удаляются. Это фактически устанавливает внешний ключ в таблице содержимого в значение null для затронутых строк, но не удаляет строки.

Затем я попытался изменить конфигурацию на:

 modelBuilder.Entity<Campaign>().HasMany(x => x.Content).WithRequired();
  

Это просто дало бы мне следующее исключение: связь из набора ассоциаций ‘Campaign_Content’ находится в состоянии ‘Deleted’. Учитывая ограничения на множественность, соответствующий ‘Campaign_Content_Target’ также должен находиться в состоянии ‘Deleted’.

Должен быть способ удаления строк из коллекции содержимого. Должно быть, я что-то упускаю. Любая помощь приветствуется.

Ответ №1:

Вам нужно будет вызвать метод Remove для соответствующего набора баз данных для каждого экземпляра объекта.

 foreach(var content in campaign.Content)
{
    dbContext.Contents.Remove(content);
}