代码之家  ›  专栏  ›  技术社区  ›  Peter Stegnar

将Include()与继承的实体一起使用

  •  12
  • Peter Stegnar  · 技术社区  · 16 年前

    在EF中,紧急加载相关实体是 easy .

    但我有困难 使用每类型模型的表加载数据时。

    这是我的模型:

    实体

    • ArticleBase (基本物品实体)
      • ArticleSpecial (继承自 )
    • UserBase
      • UserSpecial (继承自 用户库
    • Image

    关系 如图所示(省略许多列): alt text

    实际上,我的用户总是 ,自 用户库 用户库 不能以任何方式更改表的形状或形式,因为另一个应用程序将中断。

    我该怎么装 特殊条款 两者都有 CreatedBy EditedBy 设置,以便两者都是类型 用户特殊 图像


    我试过(但没有成功)这些选择:

    一。 使用lambda表达式:

    context.ArticleBases
        .OfType<ArticleSpecial>()
        .Include("UserCreated.Image")
        .Include("UserEdited.Image");
    

    在这种情况下,问题是 由创建 编辑人 用户库 图像 导航。所以我应该把这两个 类型如下:

    context.ArticleBases
        .OfType<ArticleSpecial>()
        .Include("UserCreated<UserSpecial>.Image")
        .Include("UserEdited<UserSpecial>.Image");
    

    当然,在 Include("UserCreated<UserSpecial>.Image")

    2。 我试过使用LINQ查询

    var results = from articleSpecial in ctx.ArticleBase.OfType<ArticleSpecial>()
                      join created in ctx.UserBase.OfType<UserSpecial>().Include("Image")
                      on articleSpecial.UserCreated.Id equals created.Id
                      join edited in ctx.UserBase.OfType<UserSpecial>().Include("Image")
                      on articleSpecial.UserEdited.Id equals edited.Id   
                  select articleSpecial;
    

    特殊条款 未设置相关属性的对象实例。我知道我该怎么选,但我不知道怎么选?

    我的LINQ中的Select部分可以更改为

    select new { articleSpecial, articleSpecial.UserCreated, articleSpecial.UserEdited };
    

    但图像仍然没有加载到我的上下文中。在本例中,我的连接几乎不用于过滤项目特殊结果,但它们不会将实体加载到上下文中(我想是这样的)。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    这似乎是实体框架(1.0)当前版本中的一个限制 this related SO question .

    用户创建的 用户编辑的 投影中的属性是正确的解决方案。但是,如果您还想填充 图像 上的属性 用户特殊 对象,您还必须确保包括:

    var results = from articleSpecial in ctx.ArticleBase.OfType<ArticleSpecial>()
                  select new
                  {
                      articleSpecial,
                      articleSpecial.UserCreated,
                      ((UserSpecial)articleSpecial.UserCreated).Image,
                      articleSpecial.UserEdited,
                      ((UserSpecial)articleSpecial.UserEdited).Image
                  };
    

    当然,这个查询基于以下假设 所有ArticleSpecial实体总是指一个UserSpecial实体 ,否则铸件将失败。

    var results = ctx.ArticleBase
                     .OfType<ArticleSpecial>()
                     .AsEnumerable()
                     .Select(a =>
                      {
                          var userCreated = a.UserCreated as UserSpecial;
    
                          if (userCreated != null)
                          {
                              var image = userCreated.Image;
                          }
    
                          var userEdited = a.UserEdited as UserSpecial;
    
                          if (userEdited != null)
                          {
                              var image = userEdited.Image;
                          }
    
                          return a;
                      });
    

    在后一个示例中,您也不需要包括 用户特殊 图像 结果中的实体。相反,您只需要访问 特殊条款 实体在投影阶段,以强制实体框架预先加载相关对象。