Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从SQL到EF6,我应该从哪种加载方法开始?延迟加载、显式加载、即时加载_C#_Sql_Linq_Entity Framework_Lazy Loading - Fatal编程技术网

C# 从SQL到EF6,我应该从哪种加载方法开始?延迟加载、显式加载、即时加载

C# 从SQL到EF6,我应该从哪种加载方法开始?延迟加载、显式加载、即时加载,c#,sql,linq,entity-framework,lazy-loading,C#,Sql,Linq,Entity Framework,Lazy Loading,第一个问题和一般性问题,但我没有找到任何帮助 我正在建立一个新的项目与EF6代码第一。我理解懒惰、渴望和显式加载之间的区别。我不确定的是我应该从哪个开始。ie我正在利用EF&Linq,但以后的成本是多少 以前,我会编写一个特定的SQL查询来获取一组特定的数据。有了EF,我有很大的灵活性,我担心我可能会冒险沿着加载路线前进,但当我开始性能和优化工作时,我可能会受到限制和/或切换加载方法可能会很耗时 问题是,如果我从延迟加载和虚拟属性开始,那么之后管理性能并切换到更具体的加载有多容易,还是应该在项目

第一个问题和一般性问题,但我没有找到任何帮助

我正在建立一个新的项目与EF6代码第一。我理解懒惰、渴望和显式加载之间的区别。我不确定的是我应该从哪个开始。ie我正在利用EF&Linq,但以后的成本是多少

以前,我会编写一个特定的SQL查询来获取一组特定的数据。有了EF,我有很大的灵活性,我担心我可能会冒险沿着加载路线前进,但当我开始性能和优化工作时,我可能会受到限制和/或切换加载方法可能会很耗时

问题是,如果我从延迟加载和虚拟属性开始,那么之后管理性能并切换到更具体的加载有多容易,还是应该在项目开始之前就设计好?或者从显式加载开始,关闭延迟加载?


关于

如果不了解您试图构建的系统,我将从延迟加载开始。您应该注意的主要性能问题是

如果发现自己需要迭代依赖对象,那么经常考虑另一种解决方案,例如使用包含,或者使用单独的查询来检索单个语句中的所有依赖对象,然后根据需要将两个集合加入到代码中。p>


如果您的系统侧重于报告,那么EF可能不是最佳选择。通常,报告需要连接多个从属对象才能生成正确的输出。请记住,EF是一个实体框架,实体的属性与CRUD操作有关,而不是报告。

更重要的考虑事项是:如何管理上下文实例的生命周期


通常的做法是有短暂的上下文。这意味着:获取数据,处理上下文,然后继续。反过来,这通常意味着您希望在上下文的生命周期内加载特定用例所需的数据。这反过来又意味着,您通常会使用即时加载,并尽一切努力防止在处理上下文后触发延迟加载(因为这会引发异常)。

我的经验:我从初学者开始使用延迟加载,然后在性能变得不可接受时开始使用Include。现在,我几乎总是手动编写查询,因为我的Include也已经过时了。性能对您越重要,您就越不方便。代码库越复杂、要求越高,您就越需要控制


通常,延迟加载在某一时刻是好的,下一时刻您需要手动查询并删除所有延迟加载内容。这种转变通常是突然而激进的。示例:在页面上呈现问题列表。现在,您还需要为每个问题显示question.Answers.Count()。延迟加载不能做到这一点。现在需要引入一个自定义视图模型和一个自定义查询(
questions.Select(q=>new{q.ID,q.Title,AnswerCount=q.Answers.Count()})
)。这总是迟早会发生,由不断增长的业务需求触发。我通常直接使用手动查询


要澄清的是,除了使用自定义查询之外,没有性能良好的方法来解决我刚才给出的示例。如果您在开发项目的第一个版本时没有查询,那么您可能必须告诉客户,这个小小的更改(只是添加的答案计数)将花费很多钱,因为您现在必须重写页面的某些部分。僵化往往会在以后付出高昂的代价


另外,请参阅问题下的注释以了解更多内容。

我的经验:我从初学者开始使用惰性加载,然后在性能变得不可接受时开始使用
Include
。现在,我几乎总是手动编写查询,因为我的
Include
也已经过时了。性能对您越重要,您就越不方便。代码库越复杂、要求越高,您就越被迫控制。您是否发现可以通过延迟加载轻松地改进数据访问和模型,或者您是否发现进行了大量重写,或者实际上只是替换了整个数据访问层?我想我将继续延迟加载,看看项目如何快速发展。如果结果证明这是一个错误的决定,那么我学到了一些东西:)通常,延迟加载在某一时刻是好的,下一时刻你需要手动查询并删除所有延迟加载的内容。这种转变通常是突然而激进的。示例:在页面上呈现问题列表。现在,您还需要为每个问题显示
question.Answers.Count()
。延迟加载不能做到这一点。现在需要引入一个自定义视图模型和一个自定义查询(
questions.Select(q=>new{q.ID,q.Title,AnswerCount=q.Answers.Count()})
)。这总是迟早会发生,由不断增长的业务需求触发。我通常直接使用手动查询。为了澄清这一点,除了使用自定义查询之外,没有一种性能良好的方法可以解决我刚才给出的示例。如果您在开发项目的第一个版本时没有查询,那么您可能必须告诉客户,这个小小的更改(只是添加的答案计数)将花费很多钱,因为您现在必须重写页面的某些部分。僵化往往会在以后付出高昂的代价。@usr,在您的问题中。答案示例中,您为什么不在最初查询问题时简单地包括(“答案”),而不是引入自定义查询?然后,您可以调用question.Answers.Count()来访问您的心形内容,而不会产生任何更多的数据库点击。您偶然发现了我的问题,因为该项目是2的组合,一个具有订阅和角色的信息/新闻网站(非常适合EF)和一个大型数据库