使Linq导航属性对开发人员来说更加明显

本文关键字:加明 导航 Linq 属性 开发 | 更新日期: 2023-09-27 18:29:27

在我们的代码库中,开发人员编写的循环在不知情的情况下命中了Entity Framework对象中的延迟加载导航属性,从而在循环中的每次迭代中触发DB调用,这是一个常见的错误。我想知道是否可以使用任何Visual Studio扩展或巧妙的技巧来更清楚地表明,自动生成的EF对象中的属性实际上是导航属性,这样开发人员就可以更容易地意识到要谨慎使用。有什么建议吗?

使Linq导航属性对开发人员来说更加明显

以下是一些想法:

  • 我更喜欢保持域对象最小化,所有属性都是列或导航属性。除了解决您描述的问题外,这还让消费者非常清楚哪些属性可以在LINQ查询中使用(这对不是导航属性的复杂属性没有帮助)
  • 尽早关闭您的工作单元:


    // instead of
    using (var work = new MyDbContext())
    {
        var orders = work.Orders.Where(...).ToList();
        foreach (var order in orders)
        {
            // extra queries issued here
            Console.WriteLine(order.Customer.Name);
        }
    }

// consider
List<Order> orders;
using (var work = new MyDbContext())
{
    orders = work.Orders.Where(...).ToList();
}
foreach (var order in orders)
{
    // now this line throws an exception, so the developer
    // will go back and add the .Include() statement instead
    // of just silently creating slow code
    Console.WriteLine(order.Customer.Name);
}

  • 考虑关闭延迟加载。这可以在上下文级别上完成,也可以在单个属性级别上通过使属性非虚拟来完成。虽然延迟加载很方便,但它可能是一个性能陷阱,而且对于代码审查人员来说,作为检查的额外任务,它非常不方便

  • 考虑在测试环境中使用DbInterceptor来查找延迟加载查询(它们非常独特)并记录问题

  • 让人们在开发时练习在上使用SqlServer Profiler或MiniProfiler。这使得在发出过多查询时很容易发现。

  • 使用Roslyn,您可能会编写一个分析器,静态分析代码,并在引用这些属性时显示一些诊断信息。