实体框架3.5 - 如何加载子项

Juk*_*man 10 linq entity-framework .net-3.5

我的问题可能很简单,你如何加载子/子类.没有"负载"或类似的东西,我可以找到上下文加载孩子.

上下文类是ObjectContext类型,见下文:

public partial class RTIPricingEntities : global::System.Data.Objects.ObjectContext
Run Code Online (Sandbox Code Playgroud)

产品

Product.ModifiedByUser(加载产品时如何加载这个类??)

Product.Category(加载产品时如何加载类别?)

Cra*_*ntz 16

你可以急切加载:

var q = from p in Context.Products
                  .Include("ModifiedByUser")
                  .Include("Category")
        select p;
Run Code Online (Sandbox Code Playgroud)

......或项目:

var q = from p in Context.Products
        select new 
        {
           Id = p.Id,
           Name = p.Name
           ModifiedByUserName = p.ModifiedByUser.Name,
           CategoryName = p.Category.Name
        }
Run Code Online (Sandbox Code Playgroud)

投影的优点是您只获得所需的数据,而不是每个被引用的实体.急切加载的优点是返回的实体确实改变了跟踪.为手头的问题选择合适的技术.

更新

是的,重要的要提到您正在使用RIA服务.我认为你也在客户中工作.这使事情完全不同.

在RIA Services中,确保在初始加载时返回所需实体的整个图表非常重要.您不希望在实体上调用类似.Load()的内容,因为这对服务器来说是另一个热点,这对性能不利.例如,如果您位于Silverlight客户端并从服务器请求实例列表并且它们的相关属性尚未实现,则已为时已晚.此外,Include将无法在Silverlight客户端中运行.因此,RIA Services具有服务器端工具,您可以使用它们来确保最初返回正确的,完全物化的对象图.

您需要做的是在RIA Services服务器中使用IncludeAttribute.您可以使用[Include]创建"伙伴"元数据类来装饰您的实体模型.RIA服务概述文档的第4.8节中有一些示例.


mar*_*c_s 7

使用.Include()尽可能多的其他人建议是实现您所需要的一种很好的方式.

但是,有时您可能需要稍后"重新加载"您没有"包含"的内容,或者您​​有时只需要"重新加载",因此在许多情况下放置Include语句可能会浪费计算周期.

在像"Product.Category"奇异关系情况(Product.Category是从产品的导航属性类),你最有可能也有一个"Product.CategoryReference"元素.您可以检查它是否已加载,如果没有,您可以"按需"加载它:

if(!Product.CategoryReference.IsLoaded)
{
    Product.CategoryReference.Load();
}
Run Code Online (Sandbox Code Playgroud)

现在,您引用的"类别"应该在内存中并可以使用.

如果您有一个引用事物集合的导航属性(例如产品的"部件"),您可以直接在导航属性上执行相同的操作:

if(!Product.Parts.IsLoaded)
{
    Product.Parts.Load();
}
Run Code Online (Sandbox Code Playgroud)

如果您没有将它们"包含"到EF查询中,那么对于单个或集合类型导航属性的"按需加载",这可能是一种有用的技术.