Вот мой упрощенный код:
// Domain models
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; }
public virtual ICollection OrderLineItems { get; set; }
public virtual ICollection Transactions { get; set; }
public void CreatePurchaseDebit()
{
var purchaseDebit = new Transaction()
{
Amount = OrderLineItems.Select(x => x.Product)
.Sum(x => x.Price) * -1
};
Transactions.Add(purchaseDebit);
}
}
public class OrderLineItem
{
public int ID { get; set; }
public int OrderID { get; set; }
public int ProductID { get; set; }
public virtual Product Product { get; set; }
}
public class Product
{
public int ID { get; set; }
public decimal Price { get; set; }
}
// Repository
public class Repository
{
public void Add(Order order)
{
context.Add(order);
order.CreatePurchaseDebit(); // This throws an error
}
}
Проблема здесь в том, что при попытке выполнить CreatePurchaseDebit()
Product
равно null
, хотя ProductID
было установлено соответствующим образом пользователем во времяпроцесс создания.
Я надеялся, что добавление нового Order
к DbContext
заполнит свойства модели виртуального домена через связанный идентификатор внешнего ключа.В отладчике я вижу, что Order
имеет несколько OrderLineItems
и что каждый OrderLineItem
имеет действительный ProductID
, однако Product
равен null
, поэтому я не могу получить доступ к цене Product
!
Так есть ли способ сообщить Entity Framework, что он заполняет свойства модели виртуального домена, или мой дизайн плох?
PS: Даже если я позвоню SaveChanges()
после добавления добавления нового заказа вDbContext Product
по-прежнему null
.Я хочу убедиться, что у Order
есть дебет при покупке, прежде чем звонить SaveChanges()
, чтобы ордер не существовал без транзакции.
Спасибо!