Entity Framework 4.1: как я могу получить доступ к свойствам виртуальной сущности после создания новой сущности?
Вот мой упрощенный код:
// 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()
так что заказ не может существовать без транзакции.
Спасибо!
1 ответ
Продукт не будет загружен только потому, что вы настроили ProductId
, Если вы создаете новый Order
и вы хотите, чтобы позиции заказа, заполненные продуктами, использовали идентификаторы продуктов для загрузки продуктов из базы данных и назначения их для позиций заказа.
Так что вместо этого:
var order = new Order
{
CustomerId = customerId,
OrderLineItems = new List<OrderLineItme>
{
new OrderLineItem
{
ProductId = productId
}
}
};
использовать этот:
var product = context.Products.Single(p => p.Id == productId);
var order = new Order
{
CustomerId = customerId,
OrderLineItems = new List<OrderLineItme>
{
new OrderLineItem
{
Product = product
}
}
};