繁体   English   中英

实体框架4.1:创建新实体后如何访问虚拟实体属性?

[英]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 ,但是Productnull所以我无法访问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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM