【问题标题】:Should i preload navigation properties or use other way to deal with them in Entity Framework我应该预加载导航属性还是使用其他方式在实体框架中处理它们
【发布时间】:2016-04-27 22:20:51
【问题描述】:

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

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

当我创建我的 viewModel 时,我有类似这样的代码:

        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 解决了这个问题。 这非常耗费我的时间,因为最后我需要递归检查我的视图模型中需要哪些导航属性,并将它们手动包含在第一个查询中。

我的问题是: 这个代码设计合适吗?如果不是,那么解决此类问题的正确方法是什么?

个人觉得长期下来会比较麻烦。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      因此,如果您在代码中的不同位置有重复查询,包括相同的导航属性,您可以通过扩展方法提取它们来简化您的工作。检查Entity Framework - Is there a way to automatically eager-load child entities without Include()? 中的答案,其中显示了如何执行此操作的适当示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多