EF: удаление объекта с таблицей мостов - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь отслеживать посещаемость и студентов.Для этого я использую таблицу моста.У студентов есть ICollection of PersonAttendances (bridgetable и bridgeclass), а у Attendance также есть ICollection of personAttendances.

Когда человек посещает курс в определенную дату (свойство посещаемости), в классе посещаемости метод addStudentНазывается

public void AddPerson(Person person) {
    PersonAttendance personAttendance = new PersonAttendance {   
        Person = person, Attendance = this, 
        AttendanceId = this.AttendanceId, 
        PersonId = person.PersonId 
    };  
    PersonAttendances.Add(personAttendance);
}

Пока, похоже, это работает, но я изо всех сил пытаюсь понять, как написать метод удаления, где удаляется «связь» между студентом и его посещаемостью.

Кто-то в моей группе придумал это, но мы уверены, что это не сработает, но это лучшее, что мы могли придумать

public void DeletePersoon(Person person) {
    PersonAttendance personAttendance = new PersonAttendance {
        Person = person,
        Attendance = this,
        AttendanceId = this.AttendanceId,
        PersonId = person.PersonId
    };
    PersonAttendance.Remove(personAttendance);
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Если первичный ключ PersonAttendance является составным ключом, использующим PersonId и AttendanceId, вы можете сначала избежать загрузки объекта, прикрепив объект с установленными свойствами PK, а затем установив состояние объекта в удаленное:

var theCondemned = new PersonAttendance()
{
    PersonId = person.PersonId,
    AttendanceId = this.AttendanceId,
};

PersonAttendances.Attach( theCondemned )
    .State = EntityState.Deleted;

В противном случае @rad является правильным - сначала необходимо загрузить объект из БД (чтобы получить PK), а затем удалить его.

0 голосов
/ 27 февраля 2019

Сначала вам нужно прочитать нужный объект из базы данных, а затем попытаться удалить его.
Если у вас есть объект для PersonAttendance (очевидно, ваш случай):

var pa = db.PersonAttendance.Where(p => p.PersonId == 1 && p.AttendenceId == 5).FirstOrDefault();
db.PersonAttendance.Remove(pa);
db.SaveChanges();

В противном случае:

var att = db.Attendance.Where(a => a.Id == 5).FirstOrDefault();
person.Attendence.Remove(att)
db.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...