我应该预加载导航属性还是使用其他方式在实体框架中处理它们



我目前正在使用与实体框架连接的C#编写游戏。

我与游戏中使用的主要模型的桌子有很多关系。因此,我必须使用这些模型的大量导航属性。

当我创建我的视图模型时,我有类似于下面的代码:

        Avatar = new ImageViewModel(company.Entity.ImgUrl);
        CountryName = company.Region.Country.Entity.Name;
        RegionName = company.Region.Name;
        Name = company.Entity.Name;
        Money = MoneyViewModel.GetMoney(company.Entity.Wallet);
        OwnerName = company.Owner.Name;
        OwnerID = company.OwnerID;

自然,当我想访问导航程序时,它最终会触发多个查询。

在将模型

传递给视图模型构造函数之前,我通过在控制器中使用 Include 来解决此问题。这非常耗费我的时间,因为最后我需要递归检查我的视图模型中需要哪些导航属性,并在第一个查询中手动包含它们。

我的问题是:此代码设计是否专有?如果不是,那么解决此类问题的正确方法是什么?

我个人觉得从长远来看会很麻烦。

只要您选择了预先加载 您必须手动包含所需的内容。这是您为性能付出的代价。

我会以不同的方式处理这个问题。我将创建视图和存储过程,为我提供所需的数据字段,然后使用自动映射器将值直接传输到 DTO 类中。

这通常是我所做的,它得到了回报。我得到了性能,但也保持一切非常简单和可维护。

只要使用预先加载,就需要手动包含所有需要的嵌套导航属性。但这需要更好的性能。

因此,如果在代码的不同位置有重复查询,其中包含相同的导航属性,则可以通过在扩展方法中提取它们来简化作业。检查实体框架中的答案 - 有没有办法在没有 Include()?的情况下自动加载子实体,它显示了如何做到这一点的适当示例。

最新更新