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?