[英]ADO.NET Entity Framework IsLoaded and Load
根据调用对象(例如存储库)的方式,可以执行的操作是在实体基础集上使用“ Include()”方法。
return EntitiesObject.Something.Include("Thing").Where(x=>x.ID == ID)
这样做将返回已加载“事物”的对象。
这是一篇很好的文章:
在这方面, VS2010 beta中的EntityFramework版本要友好得多。 就是说,如果您坚持使用该版本而不进行延迟加载,则此扩展方法可能会帮助您:
public static T EnsureLoaded<T>(this EntityReference<T> eRef) where T: class, IEntityWithRelationships
{
if (!eRef.IsLoaded)
eRef.Load();
return eRef.Value;
}
然后,假设您的用户对象具有联系人,则可以执行以下操作:
Contact c = User.ContactReference.EnsureLoaded();
它仍然很麻烦,但是我发现最好反复编写IsLoaded if语句。
例如,如果要加载7个客户的列表,然后为每个客户加载订单。
如果这样做是通过加载客户,然后遍历每个客户,检查订单是否已加载然后再加载。 您将收到8(1 + 7)个对数据库的调用。
如果改为在获取客户时使用Include(“ Orders”),则将没有循环,没有if语句,只有一个数据库调用。
实体框架4将具有延迟加载。
我赞同西拉子的话。 另外,我经常发现自己通过将EF生成的属性包装在部分类中来实现延迟加载。 这是一个例子:
public partial class Customer
{
public EntityCollection<Order> CustomerOrders
{
get
{
if (!Orders.IsLoaded)
Orders.Load();
return Orders;
}
}
}
在主叫侧节省一些重复。
这是完全正常的并且是预期的。 但是,这会使性能优化变得困难。 不幸的是,如果要确保已加载对象,则Include语句仍然需要在之后调用IsLoaded和Load。
我已经为1-n关系扩展了tclem解决方案:
public static EntityCollection<T> EnsureLoaded<T>(this EntityCollection<T> eRef) where T : class, IEntityWithRelationships
{
if (!eRef.IsLoaded)
eRef.Load();
return eRef;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.