Разница между DbSet.Remove и DbContext.Entry (entity) .State = EntityState.Deleted

Рассмотрим следующую модель сущности:

public class Agreement : Entity
{
    public int AgreementId { get; set; }
    public virtual ICollection<Participant> Participants { get; set; }
}

public class Establishment : Entity
{
    public int EstablishmentId { get; set; }
}

public class Participant : Entity
{
    public int AgreementId { get; set; }
    public virtual Agreement Agreement { get; set; }

    public int EstablishmentId { get; set; }
    public virtual Establishment { get; set; }

    public bool IsOwner { get; set; }
}

Причина не прямаяICollection<Establishment> в сущности Соглашения из-за свойства IsOwner, которое дополнительно определяет это отношение «многие ко многим».

Отношения отображаются так:

internal ParticipantOrm()
{
    ToTable(typeof(Participant).Name);

    HasKey(k => new { k.AgreementId, k.EstablishmentId });

    HasRequired(d => d.Agreement)
        .WithMany(p => p.Participants)
        .HasForeignKey(d => d.AgreementId)
        .WillCascadeOnDelete(true);

    HasRequired(d => d.Establishment)
        .WithMany()
        .HasForeignKey(d => d.EstablishmentId)
        .WillCascadeOnDelete(true);
}

Отношения являются однонаправленными, то есть вы можете получить доступ к Участникам только из Соглашения - вы не можете получить доступ к соглашениям от Учреждения.

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

Это похоже на работу при вызове Удалить по соглашению DbSet:

// this works
dbContext.Agreements.Remove(agreement);
dbContext.SaveChanges();

Однако он не работает, если просто установить состояние записи соглашения на удаленное:

// this causes an exception when Participants is not empty
dbContext.Entry(agreement).State = EntityState.Deleted;
dbContext.SaveChanges();

Is there a way I can define the relationship so that simply putting the Agreement entity into the deleted state will also cause the corresponding collection item entities to be put into the deleted state?

Update

Я читал об этом и обнаружил, что энергичная загрузка коллекции участников не помогает:

// eager loading does not help, this still breaks
var agreement = dbContext.Set<Agreement>()
    .Include(a => a.Participants)
    .FirstOrDefault();
dbContext.Entry(agreement).State = EntityState.Deleted;
dbContext.SaveChanges();

Ответы на вопрос(1)

Ваш ответ на вопрос