В 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;
}
}
}
Даже при такой реализации заказа он возвращается пустым.