Entity Framework 4.1: как я могу получить доступ к свойствам виртуальной сущности после создания новой сущности? - PullRequest
0 голосов
/ 26 марта 2011

Вот мой упрощенный код:

// 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 Ответ

1 голос
/ 27 марта 2011

Продукт не будет загружен только потому, что вы настроили 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
          }
      }
  };
...