2015-02-11 5 views
2

я следующая модель:Entity Framework - как удалить связанные элементы

enter image description here

У меня есть объект сущность вакансии (ef_entity), заданная из БДА, которая уже имеет один связанные подкачки элемента (учитывая из БД тоже). Я просто хочу, чтобы удалить его:

 if (ef_vacancy.Swaps != null) 
      ef_vacancy.Swaps.Clear(); 

, когда я хочу сделать SaveChanges я получаю сообщение об ошибке:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

так, Entity Framework попытаться установить «нулевой» для Swap.VacancyID таблицы вместо Вытащите записей. Но я хочу удалить. Если я попытаюсь сделать следующее:

 var swap_to_delete = (from i in _db.Swaps where i.VacancyID == ID.Value select i).FirstOrDefault(); 
     if (swap_to_delete != null && _db.Entry(swap_to_delete).State != EntityState.Deleted) 
      _db.Swaps.Remove(swap_to_delete); 

Иногда это работает, иногда нет работы! Я не понимал, почему это работает, почему бы и нет. Как это сделать легко?

ответ

3

Это должно ответить на ваш вопрос: https://stackoverflow.com/a/2058787/1154763

Данный текст ответа (кредит на Craig Stuntz):

Clear() удаляет ссылку на сущность, а не сама сущность.

Если вы собираетесь это всегда та же самая операция, вы можете обращаться AssociationChanged:

Entity.Children.AssociationChanged += 
new CollectionChangeEventHandler(EntityChildrenChanged); 
Entity.Children.Clear();    

private void EntityChildrenChanged(object sender, 
    CollectionChangeEventArgs e) 
{ 
    // Check for a related reference being removed. 
    if (e.Action == CollectionChangeAction.Remove) 
    { 
     Context.DeleteObject(e.Element); 
    } 
} 

Вы можете построить это для вашей организации с помощью частичного класса.

+0

Кроме того, вместо того, чтобы перенести этот ответ, нажмите на ссылку и подтвердите исходный ответ. – lucrativelucas

2

Вы должны удалить дочерние элементы в ef_vacancy.Swaps один за другим вручную. Entity Framework не делает этого для вас. Он, наконец, не может решить, что вы хотите делать со старыми дочерними элементами - если вы хотите выбросить их или хотите сохранить и назначить их другим родительским объектам. Невозможно просто удалить его из коллекции Swaps, поскольку он не может существовать сам по себе, поскольку он имеет не имеющий нулевой внешний ключ, ссылающийся на Vacancy (VacancyId). Вы можете удалить свопы таким образом:

foreach (var child in ef_vacancy.Swaps) 
{ 
    db.Entry(child).State = EntityState.Deleted; 
} 
Смежные вопросы