用EF在数据库中建模树状结构

本文关键字:结构 建模 EF 数据库 | 更新日期: 2023-09-27 18:13:34

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(因为循环引用/导航属性)-我创建了一组重复的对象,并将它们称为:ContainerDTO, BoxDTO, PartDTO, AttachmentDTO

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

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

但是,现在当我执行如下查询时:

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

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

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

 var q = from container in db.Container
         select new BoxDTO{
             Parts = from part in container.Parts
                     select new PartDTO
                     {
                        ...
             }
          }

将结果转换为c#等效的dto仍然需要很长时间(大约14K box需要10秒以上)。

现在,我很少需要修改数据——主要是读取数据。有人经历过这种嵌套很深、相互关联的等级制度吗?一个面向文档的数据库(如mongodb)能让我加快速度吗?

欢迎有任何建议

用EF在数据库中建模树状结构

我会考虑阅读这个帖子的答案:IEnumerable vs List -使用什么?它们是如何工作的?看起来您正在强制使用ToList()实现,而这可以通过使用IEnumerable来延迟。