我似乎被一个可能的简单解决方案所困扰。我通常在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库来自动地来回传输所有数据,这很容易。
答案 0 :(得分:3)
我已成功使用以下代码
var contents = db.Canvases
.Include(c=>c.Contents.Select(co=>co.TextContents))
.Include(c=>c.Contents.Select(co=>co.ImageContents))
.ToList();