【问题标题】:EF Code First not lazy loading just on property after data importEF Code First 不会在数据导入后仅在属性上延迟加载
【发布时间】:2012-04-09 14:42:31
【问题描述】:

我目前正在使用带有 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
            });
        }

订单状态将延迟加载,但客户不会,客户将为空。当我手动运行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 属性,但如果我将两个属性都设置为虚拟,我不需要这样做吗?此外,它适用于应用程序生成的数据,但导入的数据不起作用,除非我将 .Include 添加到查询中?

【问题讨论】:

  • 如果您将客户类的所有属性都设为虚拟会怎样?有时我看到即使一个属性是非虚拟 EF 也无法生成代理类型
  • 谢谢,但我只是尝试过,没有任何区别。它也没有解释为什么其他属性(订单状态)被延迟加载......
  • 导入是指在应用程序之外向数据库添加记录的机制,对吧?

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


【解决方案1】:

为惰性字段编写 virtual 允许 EF 从您编写的类派生并使用惰性功能重载该字段。因此,延迟加载只能对 EF 内部类型的对象起作用,而实际上您大部分时间都在使用它,并且除了让 EF 创建它之外,没有明显的方法可以获取该类型的对象。

就我而言,似乎获得您想要的结果的唯一方法是:

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

【讨论】:

  • 所以当你说“将导出的对象添加到适当的数据集”时,你指的是 .Include 方法,即 db.Orders.Include("Customer")?
  • 这是在您的代码中创建或从某些第 3 方代码接收的对象的解决方案。
  • @Halceyon 但它让我产生了一些进一步的想法......你是否启用了MultipleResultSet?如果不是 - 将此“MultipleActiveResultSets=True”添加到您的连接字符串。它应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多