我是实体框架的新手。某些屏幕强制转换I've been watching,会显示结果集在内存中的变化。这似乎可以使用大量内存。
这是否意味着EF不适合ASP.NET开发?实体框架是否具有类似于SqlDataReader的内存有效模式?
答案 0 :(得分:3)
看起来如果通过查询结果枚举为对象,实际使用了DbDataReader并且动态创建了对象,因此只有1行将作为实际的EntityObject存储在内存中。您也可以使用EntityClient Provider在DataReader级别访问数据,但如果您担心最佳性能,我认为您应该坚持使用普通的ADO.NET。
我在相当高流量的网站上使用了Entity Framework而没有内存或性能问题(每天12,000 - 20,000个唯一身份访问者,浏览量为250k)。
此外,您可能希望等待Entity Framework 4.0,或使用预发布版。它有很多改进,其中一个是对POCO(普通旧CLR对象)的支持。
答案 1 :(得分:2)
“实体框架是否具有类似于SqlDataReader的内存高效模式?”
不,EF在RAM中制作对象的完整副本,类似于DataSet和DataRelations等,但它将它们保存在对象中。然后它还必须保留每个对象的副本更改(Changesets)。然后,如果您提交更改,则每个更改都将构建为SQL以更新数据库。
SqlDataReader是一个只向前轻量级的阅读器,可以一次抓取一行。 EF会将您对查询的所有答案加载到对象集合中,并在其上方进行更改跟踪。
它适合您的应用吗?我不知道。如果您需要尽可能快的RAM和最少量的RAM,那么ADO.NET是唯一的出路。放在ADO.NET之上的任何抽象都会增加开销,内存等。
答案 2 :(得分:1)
EF将使用比直接使用ADO.net更多的内存(假设您正确使用ADO.net)
话虽如此,我们在没有内存问题的大型ASP.net项目中使用了EF。
我能想到的唯一情况是,如果你正在处理大型二进制对象,并且想要流式传输而不是将它们加载到内存中。