Как переместить дочерний объект со свойством навигации в EF - PullRequest
0 голосов
/ 06 июня 2018

У меня есть два человека, которые могут иметь запись Атенди.Я хочу объединить эти два, оставив главного Атенди, если он есть, еще используя помощника вторичного.Затем удалите вторичный.

В SQL я бы написал так:

UPDATE dbo.atendee SET personid = @main.id WHERE id = @person.atendeeid
DELETE FROM people WHERE id = @person.id

Я пробовал в EF следующее, но получаю ошибку:

    if (person.AtendeeId != null)
    {
        if (main.AtendeeId == null)
        {
            main.AtendeeId = person.AtendeeId;
            main.Atendeed = person.Atendeed;
        }
        person.AtendeeId = null;
        person.Atendeed = null;
    }

    db.Persons.Remove(person);

Ошибка:

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

Может кто-нибудь объяснить, как лучше всего перемещать ребенка?

В C # POCO.Человек имеет

public virtual int? AtendeeId { get; set; }
[ForeignKey("Id")]
public virtual Atendee Atendeed { get; set; }

В то время как у атенди есть:

public virtual int PersonId { get; set; }
public virtual Person Person { get; set; }

В SQL у Atendees есть

PersonId(int, not null)

И у людей есть

Atendeeid(int, null)

1 Ответ

0 голосов
/ 06 июня 2018

Используйте свойства навигации для осуществления перемещения, а не FK.Обязательно загружайте детей в обоих случаях.Таким образом, если для Person установлено наличие дополнительного посетителя, в котором Person хранит AttendeeId, тогда ваша логика для перемещения посетителя от одного человека к другому:

targetPerson.Attendee = sourcePerson.Attendee;
sourcePerson.Attendee = null;
context.SaveChanges();

Где и цель, и источник были получены с загруженным участником:

var targetPerson = context.People.Include(x=>x.Attendee).SingleOrDefault(x=>x.PeopleId == targetId);
var sourcePerson = context.People.Include(x=>x.Attendee).SingleOrDefault(x=>x.PeopleId == sourceId);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...