[英]Entity Framework 4.1: How can I access virtual entity properties after creating a new entity?
这是我的简化代码:
// 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
}
}
这里的问题是,即使用户在创建过程中已相应地设置了ProductID
,当尝试执行CreatePurchaseDebit()
Product
也会为null
。
我希望将新的Order
添加到DbContext
将通过关联的外键ID填充虚拟域模型属性。 在调试器中,我可以看到Order
具有多个OrderLineItems
,每个OrderLineItem
具有有效的ProductID
,但是Product
为null
所以我无法访问Product
的价格!
那么有没有办法告诉Entity Framework填充虚拟域模型属性,还是我的设计不好?
PS:即使在添加新订单到DbContext Product
后添加添加,我调用SaveChanges()
仍然为null
。 我想确保在调用SaveChanges()
之前该Order
具有购买借方,以便没有交易就不可能存在该订单。
谢谢!
仅仅因为您设置了ProductId
就不会加载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
}
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.