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