Entity Framework setzt die zugehörige Entitätseigenschaft nur dann auf "null", wenn ich die Eigenschaft zum ersten Mal erhalte

Bearbeiten Dies scheint zu geschehen fürirgendein Entitätseigenschaft, die auf eine andere Entität in einer Richtung verweist. Mit anderen Worten, für das folgende Beispiel die Tatsache, dassBar überschreibt Gleichheit scheint irrelevant zu sein.

Angenommen, ich habe die folgenden Klassen:

public class Foo
{
    public int? Id { get; set; }

    public virtual Bar { get; set; }

}

public class Bar : IEquatable<Bar>
{
    public int Id { get; set; }

    public override bool Equals(object obj)
    {
        var other = obj as Bar;

        return Equals(other);
    }

    public bool Equals(Bar other)
    {
        if (object.Equals(other, null))
            return false;

        return this.Id == other.Id;
    }

    public static bool operator ==(Bar left, Bar right)
    {
        return object.Equals(left, right);
    }

    public static bool operator !=(Bar left, Bar right)
    {
        return !object.Equals(left, right);
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

Beachten Sie, dass "Bar" hier absichtlich die Gleichheit "Id" hat, da es mehr oder weniger eine Nachschlagetabelle darstellt. Daher sollten zwei beliebige Objektreferenzen mit derselben ID immer als gleich betrachtet werden.

Hier ist der seltsame Teil, das alles funktioniert gut, wenn ich setzeFoo.Bar zum anderenBar Instanz - alles wird wie erwartet aktualisiert.

jedoch, wennfoo hat eine bestehendeBar wenn es aus dem abgerufen wirdDbContext und ich mache:

foo.Bar = null

dann ändert sich die Eigenschaft nicht wirklich!

Wenn ich mache:

var throwAway = foo.Bar;
foo.Bar = null;

Dann wird die Eigenschaft tatsächlich als Null gesetzt und gespeichert.

Seit derFoo.Bar Eigenschaft ist einfach eine virtuelle, automatisch implementierte Eigenschaft. Ich kann nur den Schluss ziehen, dass dies mit verzögertem Laden und Entity Framework-Proxys zu tun hat. Warum dieses spezielle Szenario jedoch ein Problem verursacht, weiß ich nicht.

Warum verhält sich Entity Framework so und wie kann ich es tatsächlich einstellen?null zuverlässig?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage