使用EF在db中建模树状结构

时间:2013-05-13 17:13:35

标签: c# database linq entity-framework relational-database

我有一个巨大的性能问题,EF将我的数据从数据库中删除。

假设我有一个像这样的类层次结构(想象这些都是EF生成的):

public partial class Container {
   public int Id { get; set; }
   IEnumerable<Box> Boxes {get;set;}}

public partial class Box {
   public int Id { get; set; }
   IEnumerable<Part> Parts {get;set;}

   // Navigational property
   public virtual Container Container { get; set; }
}

public partial class Part{
   public int Id { get; set; }
   IEnumerable<Attachment> FrontAttachments {get;set;}
   IEnumerable<Attachment> BackAttachments {get;set;}}

public partial class Attachment{
   public int Id { get; set; }
   String Name;}

现在,因为我需要对这些东西进行分类,并且EF不能很好地与WCF或ASP.NET MVC一起使用(因为循环引用/导航属性) - 我创建了一组重复的对象,并调用它们:{ {1}},ContainerDTOBoxDTOPartDTO

为了轻松创建DTO,我为每个实体添加了AttachmentDTO属性。例如。在容器上它看起来像这样:

DTO

然而,现在当我进行如下查询时:

public partial class Container {
    public DTO get{
        return new ContainerDTO {
            Boxes = this.Boxes.Select(b=>b.DTO); //since Box also has DTO property
        }
    };
}

这实际上会生成数千个查询(每个容器一个!)。

更糟糕的是,即使我在LINQ中执行完整的查询。 E.g:

 var db = context; //get context
 var containers = db.Container.ToList().Select(c=>c.DTO);

为了将结果转换为C#等效DTO,它仍然需要很长时间(大约14K箱子超过10秒)。

现在,我很少需要修改数据 - 大部分是读取它。 有没有人有过这种深层嵌套,相互关联的层次结构的经验?面向文档的数据库(例如mongodb)能让我加快速度吗?

欢迎任何提示。

1 个答案:

答案 0 :(得分:1)

我会考虑阅读这篇文章的答案:IEnumerable vs List - What to Use? How do they work?。您似乎正在使用ToList()强制实现,其中可以使用IEnumerable延迟它。