Entity Framework будет устанавливать для свойства связанной сущности только «ноль», если я впервые получу свойство
редактировать Кажется, это происходит длялюбой Свойство объекта, которое ссылается на другой объект в одном направлении. Другими словами, для приведенного ниже примера, тот факт, чтоBar
Равенство, кажется, не имеет значения.
Предположим, у меня есть следующие классы:
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();
}
}
Обратите внимание, что здесь «Bar» намеренно имеет равенство «Id», потому что оно более или менее представляет собой таблицу поиска - поэтому любые две ссылки на объекты с одинаковым Id всегда должны считаться одинаковыми.
Вот странная часть, все это прекрасно работает, когда я установилFoo.Bar
другомуBar
экземпляр - все обновляется, как и ожидалось.
Однако еслиfoo
имеет существующийBar
когда он извлекается изDbContext
и я делаю:
foo.Bar = null
тогда собственность фактически не изменяется!
Если я сделаю:
var throwAway = foo.Bar;
foo.Bar = null;
Тогда свойство будет фактически установлено и сохранено как ноль.
ПосколькуFoo.Bar
Свойство - это просто виртуальное, автоматически реализуемое свойство. Я могу только заключить, что это как-то связано с отложенной загрузкой и прокси-серверами Entity Framework - но почему этот конкретный сценарий вызывает проблемы, я понятия не имею.
Почему Entity Framework ведет себя так, и как я могу заставить его на самом деле установитьnull
надежно?