Unterschied zwischen DbSet.Remove und DbContext.Entry (entity) .State = EntityState.Deleted

Betrachten Sie das folgende Entitätsmodell:

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; }
}

Den Grund gibt es nicht direktICollection<Establishment> Dies liegt an der IsOwner-Eigenschaft, die diese Viele-zu-Viele-Beziehung weiter definiert.

Die Beziehung wird folgendermaßen abgebildet:

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);
}

Die Beziehung ist unidirektional, dh Sie können die Teilnehmer nur innerhalb einer Vereinbarung erreichen - Sie können nicht auf die Vereinbarungen der Einrichtung zugreifen.

Da der Primärschlüssel der Vertragsentität Teil des Primärschlüssels des gerundeten Teilnehmers ist und Kaskadenlöschung angegeben ist, würde ich davon ausgehen, dass das Versetzen der Vereinbarung in den Status "Gelöscht" auch dazu führen würde, dass jede Entität in ihrer Teilnehmersammlung auch in den Status "Löschen" versetzt wird gelöschter Zustand.

Dies scheint zu funktionieren, wenn Remove on a Agreement DbSet aufgerufen wird:

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

Es scheint jedoch nicht zu funktionieren, wenn einfach der Status des Vereinbarungseintrags auf gelöscht gesetzt wird:

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

Gibt es eine Möglichkeit, die Beziehung so zu definieren, dass durch einfaches Versetzen der Vereinbarungsentität in den Status "Gelöscht" auch die entsprechenden Entitäten für Sammlungselemente in den Status "Gelöscht" versetzt werden?

Aktualisieren

Ich habe darüber gelesen und festgestellt, dass das eifrige Laden der Participants-Sammlung nicht hilft:

// 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();

Antworten auf die Frage(1)

Ihre Antwort auf die Frage