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
          }
      }
  };
Другие вопросы по тегам