Entity framework 4 显式加载导航属性

Entity framework 4 显式加载导航属性,entity-framework-4,lazy-loading,eager-loading,Entity Framework 4,Lazy Loading,Eager Loading,在这里,我想检索所有具有最佳性能的关联类别的产品。 我首先尝试了延迟加载,但它会导致许多数据库查询。然后我使用了即时加载,但是生成的查询脚本效率不高,特别是对于复杂的查询。所以我用了下面的方法: 获取所有产品 获取所有类别和 从获取的类别中手动设置产品的导航属性类别 我的问题是: -即使我手动设置了导航属性类别,EF还会延迟加载它吗 -对于复杂查询,有没有更好的解决方案 如果使用Include,您将获得最佳效果: 这将在一个查询中加载产品及其类别,类别属性将不再触发延迟加载 更好的是扩展方法:c

在这里,我想检索所有具有最佳性能的关联类别的产品。 我首先尝试了延迟加载,但它会导致许多数据库查询。然后我使用了即时加载,但是生成的查询脚本效率不高,特别是对于复杂的查询。所以我用了下面的方法:

获取所有产品

获取所有类别和

从获取的类别中手动设置产品的导航属性类别

我的问题是:

-即使我手动设置了导航属性类别,EF还会延迟加载它吗


-对于复杂查询,有没有更好的解决方案

如果使用Include,您将获得最佳效果:

这将在一个查询中加载产品及其类别,类别属性将不再触发延迟加载


更好的是扩展方法:context.Set.Includep=>p.Category

如果使用Include,您将获得最佳效果:

这将在一个查询中加载产品及其类别,类别属性将不再触发延迟加载


更好的是扩展方法:context.Set.Includep=>p.Category

对于简单的查询,使用即时加载是没有问题的。但是,如果实体对象有许多嵌套级别,并且关系很复杂,那么查询会非常慢,因为许多表是连接的。这就是我尝试以这种方式明确加载数据的原因。但是如果这是您主要关心的问题,那么您应该使用更复杂的场景。对于您展示的示例,Include是一种方式。经验法则是一条语句中包含的树不应超过一个。对于复杂的查询,很难给出进一步的一般性建议。这取决于具体情况。@GertArnold如果您创建了一个新产品,但该产品还不在数据库中,您需要加载它的类别,该怎么办?对于简单的查询,使用即时加载是没有问题的。但是,如果实体对象有许多嵌套级别,并且关系很复杂,那么查询会非常慢,因为许多表是连接的。这就是我尝试以这种方式明确加载数据的原因。但是如果这是您主要关心的问题,那么您应该使用更复杂的场景。对于您展示的示例,Include是一种方式。经验法则是一条语句中包含的树不应超过一个。对于复杂的查询,很难给出进一步的一般性建议。这真的取决于具体情况。@GertArnold如果您创建了一个新产品,但它还不在数据库中,您需要加载它的类别,该怎么办?您确实不需要显式地创建它。更改跟踪会自动为您修复依赖项。请看我对另一个问题的回答,但它也说明了你需要什么:你真的不需要明确地回答。更改跟踪会自动为您修复依赖项。请看我对另一个问题的回答,但它也说明了您需要什么:
public class MyDbContext: DbContext
{
}
public class Product
{
   public long Id {get; set;}

   public long CategoryId {get; set;}

   [ForeignKey("CategoryId")] 
   public virtual Category Category {get; set;}
}
public class Category
{
   public long Id {get; set;}
   public string Name {get; set;}
}

List<Product> GetProducts()
{
    var context = new MyDbContext();
    var products = context.Set<Product>().ToList();
    var categories = context.Set<Category>().ToList();
    foreach(var product = in products)
    {
        product.Category = categories.First(c => c.Id == product.CategoryId);
    }

    return products;
 }
var products = context.Set<Product>().Include("Category");