Entity Framework 的分析(一个回帖的内容)

对于大中型应用,我建议还是不要用ADO.Net Entity Framework。像你这个需求,如果用ADO.Net直接操作数据库,做好索引的话,应该所有操作在100MS以内,当然也要看你的数据量级,一般100MS是可以接受的。你只要用Sql Profile抓一下语句,就可以知道你的操作,使用Ado.net Entity Framework的时候,自动使用了什么语句,而这个语句,如果拆成多个查询,最终再组合,或许性能会高出很多。

数据表间关系不同,各种情况查询、添加的结果也不同,同时,使用SQL语句的方式不同,操作结果也不一样(比如ADO.NET使用参数传递的方式,会在第一次预编译并缓存SQL语句,而直接拼sql语句的方式,也会对性能带来一定影响)。对于Ado.net entity framework和Ado.net直接操作数据库,我个人感觉,应该是后者更快,我认为Ado.net是原生态,Entity framework还是以ADO.Net为基础的,虽然加上了一些缓存功能和对用户操作透明的机制,或许我理解得不对。

今天我是第一次正儿八经地研究Entity Framework,感觉没像想象那么好。但是根据我自己使用微软MSDN帮助中的School例子的分析来看,结果不尽人意。如下:

    对于关系数据库,使用Ado.Net Entity framework,自带的数据查询方法,会导致大量数据库的操作。不适合用在大系统中,适合小网站、小企业应用的开发
    对一个表,本来只需要查询一个简单的列表,但Entity framework会将相关的所有表,都通过JOIN的方法,连接查询。而这个过程,据目前研究,对用户是透明的,比较难以修改。
    如微软MSDN帮助自带的School范例,本来只需要查询Department下的课程,但从Sql Server Profile中发现,第一次查询,会执行如下语句:

SELECT
[Project2].[DepartmentID] AS [DepartmentID],
[Project2].[Name] AS [Name],
[Project2].[Budget] AS [Budget],
[Project2].[StartDate] AS [StartDate],
[Project2].[Administrator] AS [Administrator],
[Project2].[C1] AS [C1],
[Project2].[C2] AS [C2],
[Project2].[CourseID] AS [CourseID],
[Project2].[Title] AS [Title],
[Project2].[Credits] AS [Credits],
[Project2].[DepartmentID1] AS [DepartmentID1],
[Project2].[CourseID1] AS [CourseID1],
[Project2].[CourseID2] AS [CourseID2]
FROM ( SELECT
 [Extent1].[DepartmentID] AS [DepartmentID],
 [Extent1].[Name] AS [Name],
 [Extent1].[Budget] AS [Budget],
 [Extent1].[StartDate] AS [StartDate],
 [Extent1].[Administrator] AS [Administrator],
 1 AS [C1],
 [Project1].[CourseID] AS [CourseID],
 [Project1].[Title] AS [Title],
 [Project1].[Credits] AS [Credits],
 [Project1].[DepartmentID] AS [DepartmentID1],
 [Project1].[CourseID1] AS [CourseID1],
 [Project1].[CourseID2] AS [CourseID2],
 [Project1].[C1] AS [C2]
 FROM  [dbo].[Department] AS [Extent1]
 LEFT OUTER JOIN  (SELECT
  [Extent2].[CourseID] AS [CourseID],
  [Extent2].[Title] AS [Title],
  [Extent2].[Credits] AS [Credits],
  [Extent2].[DepartmentID] AS [DepartmentID],
  [Extent3].[CourseID] AS [CourseID1],
  [Extent4].[CourseID] AS [CourseID2],
  1 AS [C1]
  FROM   [dbo].[Course] AS [Extent2]
  LEFT OUTER JOIN [dbo].[OnlineCourse] AS [Extent3] ON [Extent2].[CourseID] = [Extent3].[CourseID]
  LEFT OUTER JOIN [dbo].[OnsiteCourse] AS [Extent4] ON [Extent2].[CourseID] = [Extent4].[CourseID] ) AS [Project1] ON [Extent1].[DepartmentID] = [Project1].[DepartmentID]
)  AS [Project2]
ORDER BY [Project2].[Name] ASC, [Project2].[DepartmentID] ASC, [Project2].[C2] ASC
这对大表来说,是个不可想像的操作。
当然,Entity framework使用了缓存,对于后续操作,未见其从数据库查询数据的动作。不过这只是一个Windows应用,至于web应用是什么情况,目前还不得而知。
由于Entity framework使用了数据缓存,但缓存大小、缓存生命期等的不可控性,目前还不好说Entity framework对系统的影响能有多大。

对于大型项目,特别是对性能要求特别高的项目,在没弄清楚Ado.Net Entity framework存在的各种风险之前,建议还是不要使用。对于小项目小网站,Ado.net EF倒是一个不错的选择,毕竟它的确带来了开发的便捷性。


阅读更多
个人分类: C#
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭