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 надежно?

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

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