在EF 4.1 eager loading中,如何加载多个(同级别)孙子关系?

时间:2012-02-23 13:50:23

标签: c# asp.net-mvc-3 entity-framework entity-framework-4.1 ef-code-first

我似乎被一个可能的简单解决方案所困扰。我通常在EF 4.1中使用延迟加载,现在我正在尝试在我的应用程序中使用预先加载,因此我可以使用内置的JSON序列化器而不会出现问题。我遇到的问题是我无法弄清楚如何使用.Include()来加载多个同级孙子关系。

public class Canvas
{
    public int ID { get; set; }
    public string Name { get; set; }

    public ICollection<ContentArea> Contents { get; set; }
}

public class ContentArea
{
    public int ID { get; set; }
    public int CanvasID { get; set; }
    public string Name { get; set; }

    public ICollection<TextContent> TextContents { get; set; }
    public ICollection<ImageContent> ImageContents { get; set; }
}

public class TextContent
{
    public int ID { get; set; }
    public int ContentAreaID { get; set; }
    public string Text { get; set; }
    public int Color { get; set; }
}

public class ImageContent
{
    public int ID { get; set; }
    public int ContentAreaID { get; set; }
    public string Filename { get; set; }
}

我尝试了以下但没有成功。如何编写加载代码以加载TextContents和ImageContents?

不编译:

var c = dataContext.Canvases
        .Include(ca => ca.Contents.Select(co => co.ImageContents).Select(co => co.TextContents))
        .FirstOrDefault();

不起作用,第二次包括覆盖:

var c = dataContext.Canvases
        .Include(ca => ca.Contents.Select(co => co.ImageContents))
        .Include(ca => ca.Contents.Select(co => co.TextContents))
        .FirstOrDefault();

不起作用,抛出运行时异常:

var c = dataContext.Canvases
        .Include(ca => ca.Contents.Select(co => new { co.ImageContents, co.TextContents }))
        .FirstOrDefault();

编辑:

我现在已经放弃了这种方法,并且基于其他一些文章和方法制作了视图模型,这些文章和方法解决了使用JSON序列化内置的ASP.NET MVC解决“序列化实体模型”问题。这导致我复制了我的类,但是通过使用AutoMapper库来自动地来回传输所有数据,这很容易。

1 个答案:

答案 0 :(得分:3)

我已成功使用以下代码

var contents = db.Canvases
                 .Include(c=>c.Contents.Select(co=>co.TextContents))
                 .Include(c=>c.Contents.Select(co=>co.ImageContents))
                 .ToList();