0

这是我的简化代码:

// 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() Productnull即使ProductID用户在创建过程中已经相应地设置了。

我希望添加新OrderDbContext将通过关联的外键 ID 填充虚拟域模型属性。在调试器中,我可以看到Order有多个OrderLineItems,并且每个OrderLineItem都有一个有效的,ProductID但是我无法访问的价格!ProductnullProduct

那么有没有办法告诉实体框架填充虚拟域模型属性或者我的设计不好?

PS:即使我SaveChanges()在将新订单添加到 DbContext 之后调用Product仍然是null. 我想确保Order在致电之前有购买借记卡,SaveChanges()这样在没有交易的情况下订单就不可能存在。

谢谢!

4

1 回答 1

1

产品不会因为您设置而被加载ProductId。如果您创建新的Order并且希望使用产品填充订单行项目,请使用产品的 ID 从数据库加载产品并将它们分配给订单行项目。

所以不要这样做:

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
          }
      }
  };
于 2011-03-26T22:06:07.570 回答