RemoveAll()和Remove()不能处理一对多关系

时间:2016-06-16 14:10:55

标签: c# sql entity-framework linq

我在HouseHoldsInvites之间存在一对多的关系。一个HouseHold到多个Invites。我希望在发送邀请后7天内从表中删除邀请。我没有收到错误,但过期的邀请仍然在表中。我之前试过RemoveAll()没有运气。我是新手,不知道另一种尝试的方法,有什么建议吗?

var dt = DateTime.Now;
var hh = db.HouseHolds.Find(id);
var invList = hh.Invites.ToList();
foreach (var i in invList)
{
    if (DateTime.Compare(i.InviteDate.Date.AddDays(7).Date, dt) < 0)
        hh.Invites.Remove(i);
}

1 个答案:

答案 0 :(得分:1)

由于您的Invite表格中的FK属性不可为空,因此您无法从Remove导航属性中删除调用Invites方法的关系。问题是那些在该行动之后,实体将成为孤儿。解决此问题的一个选项是覆盖SaveChanges方法:

public override int SaveChanges()
{
     Invites
        .Local
        .Where(r => r.HouseHold== null)
        .ToList()
        .ForEach(r => Invites.Remove(r));

    return base.SaveChanges();
}

或者您也可以在周期中将这些实体的状态更改为Deleted

foreach (var i in invList)
{
  if (DateTime.Compare(i.InviteDate.Date.AddDays(7).Date, dt) < 0)
  {
     hh.Invites.Remove(i);
     db.Entry(i).State = EntityState.Deleted;
  }
}