Почему мои свойства навигации не загружаются после создания связанных сущностей? - PullRequest
1 голос
/ 11 июля 2019

В Entity Framework у меня есть класс Order:

public class Order 
{
    public Order() 
    {
        this.Info = new HashSet<OrderInfo>();
    }

    [Required]
    public int Id { get; set; }

    [NotNull, MapTo("RecordId")]
    public virtual ICollection<OrderInfo> Info { get; set; }
}

с отношением один-ко-многим к классу OrderInfo:

public class OrderInfo
{
    public OrderInfo() { }

    public int RecordId { get; set; }
}

В моей таблице OrderInfo RecordId - это внешний ключ, который соответствует столбцу Id Заказа (первичный ключ Заказа).

Я создаю объект Order, затем создаю OrderInfo, который сопоставляется с заказом. Вот так:

using (var context = new MyDbContextClass())
{
    // method that creates an Order, adds it to the context's change tracker
    // and returns the order's Id
    var orderId = await CreateOrder(); 

    // method that creates an OrderInfo with orderId as its RecordId
    // and adds it to the context's change tracker
    await CreateOrderInfo(orderId, "Order info contents");

    // calls DbContext.SaveChanges()
    await context.Commit();

    var order = context.Order.Find(orderId);
    var associatedOrderInfo = order.Info;

    var queriedOrderInfo = context.OrderInfo.Where(info => info.RecordId == orderId);
}

associatedOrderInfo всегда пусто, а queriedOrderInfo всегда имеет ожидаемые значения. Кроме того, если я затем открою новый контекст и снова получу заказ по идентификатору, его Info содержит ожидаемые значения.

Я подтвердил следующее:

  • context.Configuration.ProxyCreationEnabled верно (проверено отладчиком)
  • context.Configuration.LazyLoadingEnabled верно (проверено отладчиком)
  • Объявлено свойство навигации public virtual
  • Тип, на который ссылается свойство навигации, имеет открытый конструктор без параметров.

Исходя из моего понимания отложенной загрузки, он запрашивает в базе данных объекты OrderInfo, у которых в качестве идентификатора RecordId указан идентификатор заказа. На этом этапе данные были зафиксированы, и мой уровень изоляции зафиксирован для чтения. Следовательно, при первом запросе порядок должен давать мне связанные объекты OrderInfo, а не открывать новый контекст для их поиска. Почему он возвращается пустым?


Edit:

Я также пытался принудительно инициализировать свойства навигации, как в этом вопросе . Вот мой класс заказа:

public class Order 
{
    public Order() 
    {
    }

    [Required]
    public int Id { get; set; }

    private ICollection<OrderInfo> _Info;

    [NotNull, MapTo("RecordId")]
    public virtual ICollection<OrderInfo> Info
    {
        get
        {
            return this._Info ?? (this._Info= new HashSet<OrderInfo>());
        }
        set
        {
            this._Info = value;
        }
    }
}

Даже при такой реализации заказа он возвращается пустым.

...