我目前正在使用与实体框架连接的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()?的情况下自动加载子实体,它显示了如何做到这一点的适当示例。