使Linq导航属性对开发人员来说更加明显
本文关键字:加明 导航 Linq 属性 开发 | 更新日期: 2023-09-27 18:29:27
在我们的代码库中,开发人员编写的循环在不知情的情况下命中了Entity Framework对象中的延迟加载导航属性,从而在循环中的每次迭代中触发DB调用,这是一个常见的错误。我想知道是否可以使用任何Visual Studio扩展或巧妙的技巧来更清楚地表明,自动生成的EF对象中的属性实际上是导航属性,这样开发人员就可以更容易地意识到要谨慎使用。有什么建议吗?
以下是一些想法:
- 我更喜欢保持域对象最小化,所有属性都是列或导航属性。除了解决您描述的问题外,这还让消费者非常清楚哪些属性可以在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,您可能会编写一个分析器,静态分析代码,并在引用这些属性时显示一些诊断信息。