ADO.NET Entity framework研究

本文分享了作者首次深入研究 EntityFramework 的经验,指出其在关系型数据库操作方面的问题,尤其是在复杂查询时可能导致数据库负担过重,并探讨了其在不同应用场景下的适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值