我如何确保父级被删除时,它没有孩子

本文关键字:删除 孩子 何确保 确保 | 更新日期: 2023-09-27 18:03:30

在我的应用程序中,我有一个1 -多关系,它将"插槽"映射为"广告",这样一个广告可以添加到多个插槽。

Slot (id, location)
Advert (slot_id, text, url)

然而,当广告从所有插槽中删除时,我也希望它被删除。

我认为这样做的最好方法是在Slot.Advert setter和Advert.Slots.Remove()方法中添加一个检查,这样如果最后一个关系被删除,广告就可以被删除;

public class Slot
{
    public int Id { get; set; }
    public int? AdvertId { get; set; }
    private Advert _Advert;
    public virtual Advert Advert
    {
        get
        {
            return _Advert;
        }
        set
        {
            if (_Advert != value && _Advert != null && _Advert.Slots.Count == 1)
            {
                // How do I delete the _Advert here? I have no access to the context? :(
            }
            _Advert = value;
        }
    }
}

然而,正如上面所看到的,我没有在setter中得到一个"上下文"实例,所以我无法删除广告。

虽然我可以打开一个新的上下文,

  • 感觉错了
  • 被删除的广告和应用到插槽的新广告不是事务性的(发生在两个独立的上下文连接中)。

有人知道我有什么选择吗?我在POCO土地和使用实体框架6.1

我如何确保父级被删除时,它没有孩子

根据您的上下文使用SaveChanges方法。

public override int SaveChanges()
{
    foreach (var entry in ChangeTracker.Entries<Advert>().Where(e=>e.Entity.Slots.Count()==0))
    {
        entry.State = EntityState.Deleted;
    }
    return base.SaveChanges();
}