EF Code First在数据导入后不会在属性上延迟加载

时间:2012-04-09 14:42:32

标签: entity-framework ef-code-first code-first

我目前正在使用带有SQL 2008 R2的EF版本4.3.1

当我使用应用程序生成的数据运行应用程序时,一切正常,但只要我导入数据,那么只有一个属性不想延迟加载。

这是我正在使用的Order类:

[DisplayName("Orders")]
public class Order
{
    [Key]
    [DisplayName("Order Number")]
    public virtual string OrderNumber { get; set; }

    [StringLength(30, ErrorMessage = "Order name cannot be more than 30 characters.")]
    public string Name { get; set; }

    [DisplayName("Order Status")]
    public virtual OrderStatus OrderStatus { get; set; }

    [Timestamp]
    public Byte[] TimeStamp { get; set; }

    [DisplayName("Customer")]
    [Required()]
    public virtual Customer Customer { get; set; }

    [DisplayName("Order Lines")]
    public virtual ICollection<OrderLine> OrderLines { get; set; }
}

循环完成所有订单时:

foreach (var order in orders)
        {
            returnValue.Add(new FriendlyOrder()
            {
                Customer = order.Customer.Name,
                Name = order.Name,
                OrderNumber = order.OrderNumber,
                OrderStatus = order.OrderStatus.Status
            });
        }

Order状态将延迟加载,但不是Customer,Customer将为null。当我手动运行SQL查询时,关系就在那里,因此它与坏数据无关。

以下是客户实体:

[DisplayName("Customers")]
public class Customer
{
    [Key]
    [DisplayName("Customer Code")]
    public string CustomerCode { get; set; }

    public virtual ICollection<Order> Orders { get; set; }

    public bool Active { get; set; }

    [Timestamp]
    public Byte[] TimeStamp { get; set; }

}

以下是订单查询:

return (from tbl in db.Orders orderby tbl.OrderNumber select tbl).ToList();

如果我手动将.Include(“Customer”)包含在上述查询中,那么它将加载Customer属性,但如果我将这两个属性都设置为virtual,我不应该这样做吗?此外,它适用于应用程序生成的数据,但导入的数据不起作用,除非我将.Include添加到查询中?

1 个答案:

答案 0 :(得分:3)

为惰性字段编写虚拟允许EF从您编写的类派生,并使用惰性功能重载该字段。因此,延迟加载只能在EF内部类型的对象上工作,大多数时候你都在使用它,除了让EF创建它之外,没有明显的方法来获取该类型的对象。

至于我,看来获得你想要的结果的唯一方法是:

  1. 将导出的对象添加到适当的数据集
  2. 提交更改
  3. 从跟踪中删除对象
  4. 查询对象,以便EF从头开始生成。