我首先使用Entity Framework 4.1代码而没有存储过程。我想知道关于它在大型应用程序上的性能的一般意见,因为它在后台生成SQL。这不违反不使用存储过程的最佳做法吗?你如何微调这些生成的代码?
我知道你可以破解它来使用存储过程,但是肯定会支持存储过程和你使用数据库第一个选项获得的其他函数吗?
EF 4.1对数据库优先选项有什么改进吗?我怎么知道我是否有最新版本的EF?
答案 0 :(得分:3)
生成的SQL效率相当高,但是虽然我还没有使用SP,但为了克服一些性能问题,我已经编写了一些视图(在4.0中)并编写了LINQ来对付那些地方。
4.1是否违反存储过程的最佳做法?那么SP是最佳实践,原因有多种 - 性能是一种,从代码中隔离和抽象底层表结构是另一种原因。这部分的性能部分似乎已被抛弃,因为“这些天可能不那么重要”,原因是我没有100%的味道。而抽象问题 - 你正在使用EF Code First是有原因的 - 原因是你正在为你的应用程序对象寻找一个持久性框架:通过选择EF Code First的行为,你宣称你没有想知道它们是如何存储的,以什么结构存在,以及将它们带回来会发生什么。
你如何调整它?主要是通过非常小心延迟加载,通过监视SQL端发生的事情(EFProf是一个工具,MSSql查询分析也可以工作),通常是通过摆弄东西。
要确保您运行的是最新的EF(如果您一直在运行CodeFirst CTP),请使用NuGet控制台和
uninstall-package EFCodeFirst
install-package EntityFramework
4.1首先对数据库进行了4.0的改进 - 即轻量级dbContext
编辑:按要求添加代码... 简单案例
foreach (var order in orders) y=order.orderlines.tolist();
你用
修复foreach (var order in orders.Include("orderlines").tolist()) y=order.orderlines.tolist();
但不太明显
foreach (var order in orders.Include("orderlines").tolist()) dothing(order);
,其中
public void dothing(Orderline ol)
{
if (ol.order.property=true)
....
}
解决这个问题,我认为你需要
foreach (var order in orders.Include("orderlines.orders").tolist()) dothing(order);
(或者更好的还是重构(Orderline ol)到dothing(Orderline ol,Order ord)。我的观点是,使用本地数据库很容易错过这些。只有当您分析sql或连接到慢速网络上的SQL数据库(想想Azure)或者只是严重负载,这开始受到伤害!