用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)能让我加快速度吗?
欢迎有任何建议
我会考虑阅读这个帖子的答案:IEnumerable vs List -使用什么?它们是如何工作的?看起来您正在强制使用ToList()实现,而这可以通过使用IEnumerable来延迟。