2016-08-25 1 views
1

Я использую сначала код Entity Framework (версия 6) и GraphDiff в моем проекте MVC.Удалить владение объектами 2 уровня глубины с помощью GraphDiff

вот некоторые объекты, которые отображают некоторые таблицы в базе данных.

public class CommunicationPlan 
{ 
    public int CommunicationPlanID { get; private set; } 

    [Owned] 
    public List<CommunicationTopic> Topics { get; private set; } 
} 

public class CommunicationTopic 
{ 
    public int CommunicationTopicID { get; private set; } 

    [Owned] 
    public List<ContributingMember> Members { get; private set; } 
} 

public class ContributingMember 
{ 
    public int ContributingMemberID { get; private set; } 

    // other simple properties 
} 

Когда я создаю CommunicationPlan, которые имеют много CommunicationTopic с с их ContributingMember с и сохранить совокупный корень CommunicationPlan, то GraphDiff будет создавать все записи и связать их в базе данных. (как я хочу точно)

Проблема
Когда я пытаюсь удалить один из CommunicationTopic из существующих CommunicationPlan то эта тема будет удалена из базы данных (как мне нужно), Но ContributingMember s, которые связанные с что CommunicationTopic НЕ удаляется из базы данных. Только их значения внешнего ключа установлены равными нулю, и они находятся в базе данных.

Когда я настроить внешний ключ ContributingMember, чтобы не принимать нулевые значения, то я получаю следующее исключение

Операция не удалась: Отношения не могут быть изменены из-за одного или нескольких иностранных Свойства ключа не имеют значения NULL. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный с ним объект должен быть удален.

Вопрос Как я могу настроить Entities сделать GraphDiff удалить ContributingMember сек записи, когда его родитель - CommunicationTopic - удален?

ответ

1

Я думаю, что вы можете иметь два способа решить эту проблему

  1. Попробуйте настроить каскадные свойства отношений в базе данных, чтобы быть CASCADE DELETE между CommunicationTopic и ContributingMember
  2. Убедитесь, что весь график ваш AggregateRoot загружается при попытке удалить его
+1

спасибо, сэр, это решило мою проблему. Я просто забыл установить значение внешнего ключа «ContributingMember» равным 0, поэтому при обновлении базы данных с помощью внешнего ключа 0 я получал исключение конфликта обновления –