实体框架代码优先:如何从对象中加载关联的对象

时间:2012-03-26 17:13:47

标签: c# entity-framework entity-framework-4.1

假设您有两个班级,订单和客户:

public class Customer{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
    public ICollection<Order> Orders { get; set; }
}

public class Order{
    public int OrderId{get; set;}
    public Customer OrderCustomer{get; set;}
}

现在,我想在我的Customer类中添加一个“CanBeDeleted”方法,告诉我的程序是否可以删除该客户。我想确保只有在没有订单的情况下才能删除客户:

public class Customer{
       public int CustomerId { get; set; }
       public string CustomerName { get; set; }
       public ICollection<Order> Orders { get; set; }

       [NotMapped]
       public bool CanBeDeleted {
           get {
               return Orders.Count() == 0;
           }
       }
   }

当然,问题是程序不知道客户是否加载了订单的include选项。

如何在“CanBeDeleted”getter中确保订单已加载/如何在不引用DbContext的情况下加载它们?

1 个答案:

答案 0 :(得分:1)

默认情况下,Entity Framework Code First会在访问它们时延迟加载相关实体。

但是,您拥有相关实体的属性必须声明为virtual,而您似乎并没有这样做。

必须声明它们virtual的原因是实体框架创建了一个代理类,它覆盖了您的实现并注入代码以在首次访问时加载相关实体。

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx