gpt4 book ai didi

c# - 使 Linq 导航属性对开发人员更加明显

转载 作者:行者123 更新时间:2023-11-30 23:31:18 25 4
gpt4 key购买 nike

在我们的代码库中,开发人员编写的循环在不知不觉中命中了 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);
}
}<p></p>

<pre><code>// 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);
}
</code></pre>

<p></p>

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

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

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

  • 使用 Roslyn,您可能可以编写 analyzer它静态分析代码并在引用这些属性以调出它们时显示一些诊断信息。

关于c# - 使 Linq 导航属性对开发人员更加明显,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com