0

这里是我的简化代码:实体框架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当是即使ProductID已相应地由用户在创建过程中设置null

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

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

PS:即使在添加新的订单到DbContext Product仍然是null后,我呼叫SaveChanges()。在致电SaveChanges()之前,我想确保Order有一个购买借记卡,以便在没有交易的情况下订单不可能存在。

谢谢!

回答

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 
      } 
     } 
    };