EF:使用桥表删除对象

时间:2019-02-27 16:04:31

标签: c# asp.net entity-framework model-view-controller

我正在努力跟踪出勤率和学生人数。为此,我使用了桥表。学生有一个PersonAttendances的ICollection(bridgetable和bridgeclass),而Attendance也有一个PersonCollection的ICollection。

某人在某个日期(出勤属性)上课时,在出勤类中,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 :(得分:1)

首先,您需要从数据库中读取所需的对象,然后尝试将其删除。
 如果您拥有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();

答案 1 :(得分:0)

如果PersonAttendance的主键是使用PersonIdAttendanceId的复合键,则可以通过在对象上附加PK属性集,然后再设置要删除的实体状态:

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

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

否则@rad是正确的-您必须首先从数据库加载实体(以获取PK),然后再将其删除。