在EF 4.1热切加载中,如何加载多个(同一级别)孙关系

本文关键字:加载 一级 关系 孙关系 何加载 EF | 更新日期: 2023-09-27 18:25:29

我似乎被一个可能的简单解决方案难住了。我通常在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();

不起作用,第二个Include覆盖第一个:

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库自动来回传输所有数据,这变得很容易。

在EF 4.1热切加载中,如何加载多个(同一级别)孙关系

我成功地使用了以下代码

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