今天是我闲着没事,第一次正儿八经地研究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倒是一个不错的选择,毕竟它的确带来了开发的便捷性。