ASP.Net中Ado.Net Entity Framework实际项目应用释疑

简介:

关于Ado.Net Entity Framework 的理论、入门教学文章已不少了,但是很少有人讲到在ASP.Net项目中实际项目应用的问题,往往学的时候轻松搞定,一上手项目就一头雾水。

比如在教程中最常见的这种形式的使用方法:

using(MyObjectContext c=new MyObjectContext())

{

……

}

如果在实际应用中,每每需要连接数据库,就造这么一个代码块的话,那么一个页面访问时就可能会创建数个数据库连接,致使并发用户访问数大打折扣;

而假如只使用一个这样的代码块的话,那么由于分层、服务器控件、用户控件等因素,又难以将所有数据库访问操作都揉到这一个代码块当中;

那么到底该怎样做才是最佳方案呢?

这个问题或许是Entity Framework的使用者产生疑惑最多的一点。

我在此将结合自己的经验,解答包括上述问题在内的一些在ASP.Net实际项目中容易产生的疑问。

准备工作

首先,我们需要搭建一个演示环境。

建立一个数据库,并创建如下两个表:

image3

关系:Article的PostUser字段对应到User的ID字段

将两个表分别填充一些数据:

image9

image6

生成Entity Framwork模型:

 image48

准备工作完成。

如何设计业务逻辑层?

如果要扩展实体类的功能,应该通过“部分类”(partial)实现:

image17

如果需要借助ObjectContext对象查询或更新数据库,应将ObjectContext定义为方法参数,而不是在业务逻辑层中创建ObjectContext对象。

例如,下面的方法不应该出现在业务逻辑层:

 image33

更好的做法是:

 image37

上图中高亮的重载方法只应在需要时才编写,通常都可予以忽略。

(方法中的统计总数的代码语句完全可以由LinQ语句替代完成,并且非常精简,而这里只是象征性演示,别太在意) 

如何快速通过主键获取对应实体?

image41

这样是从缓存中直接取出实体对象,效率非常高。

如何优化查询性能?

可通过CompiledQuery.Compile()预编译查询:

image45

如何在同一页面中共享一个ObjectContext?

一般来说,一个页面只需要一个数据库连接,这样可以减少数据库的并发压力,使同一时间可以有更多用户访问网站。

而通常情况下,我们都使用ObjectContext的无参构造函数创建包含默认连接的ObjectContext对象,因此,在同一页面中共享一个ObjectContext就能实现同一页面共享一个数据库连接的目标。

接下来我们将在页面中放置两个EntityDataSource控件,分别获取所有用户及所有文章,并以ListView控件显示出来。

同时还要放置一个用户控件,用来获取并显示每个用户曾发布的文章。

我们先来创建用户控件界面:

image52

用户控件界面中仅包含一个ListView控件。

(为了简单起见,ul中的li代码将由后台生成,然后直接绑定到这里) 

接着是后台代码:

 image60

注意,这里定义了一个ObjectContext属性,程序将通过该属性访问数据库及业务逻辑层,但该属性并未在这里初始化,而是要由使用此用户控件的页面初始化该属性。

接下来编写页面前台代码:

image64

简单的放置并配置了两个EntityDataSource及ListView,并放置了一个前面创建的用户控件。

后台代码:

image68

这里也同样设置了一个ObjectContext属性,并在蓝色高亮处重写了OnInit,在其中进行初始化,并赋值给用户控件,然后在绿色高亮处重写了Dispose,对ObjectContext进行释放。

这样用户控件就将和页面使用同一个ObjectContext对象了。

然而,每个EntityDataSource还都会自己创建ObjectContext连接数据库,这显然不合我们的期望,解决办法是分别注册它们的ContextCreating、ContextDisposing事件,做如下处理:

image72

这样页面虽然多次在不同的位置访问数据库,但仅使用一个ObjectContext、一个数据库连接。

执行结果:

image90

如何在多个ObjectContext共享一个数据库连接?

EntityConnection即代表一个数据库连接,可以通过创建EntityConnection对象,并将其分配给多个ObjectContext对象,实现多ObjectContext共享单连接,具体方法可参看MSDN:http://msdn.microsoft.com/zh-cn/library/bb738582.aspx

多ObjectContext共享一个连接,与整页面共享一个ObjectContext有什么不同呢?

一般来说感觉不到什么不同,但当你将更改提交到数据库时,单个ObjectContext将维护全部相关事务,一旦提交失败将全部回滚,而多个ObjectContext就可以分别处理各自的事务,相比之下更具灵活性。

结语

在这里我仅以自己的经验总结而出了一些问题和解决方案,若有其他疑问欢迎补充,共同探讨。

针对上面的问题,如有更好的解决方案的话,也欢迎赐教。

 

下载范例源代码:

 

下载本文的XPS版本:


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2009/07/20/1526767.html,如需转载请自行联系原作者

相关文章
|
18天前
|
机器学习/深度学习 人工智能 Cloud Native
洞察.NET 技术的前沿应用
【7月更文挑战第4天】**洞察.NET技术前沿:.NET Core跨平台崛起,云原生与AI应用深化。ML.NET、TensorFlow.NET助力机器学习,Xamarin与MAUI统一跨平台UI。Azure云服务支持下,.NET引领软件开发新趋势。**
27 5
|
1月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
39 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
18天前
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
20 3
|
18天前
|
人工智能 物联网 开发者
**.NET技术革新赋能软件开发:从.NET 5的性能飞跃、跨平台支持,到微服务、物联网、AI和游戏开发的广泛应用。
【7月更文挑战第4天】**.NET技术革新赋能软件开发:从.NET 5的性能飞跃、跨平台支持,到微服务、物联网、AI和游戏开发的广泛应用。随着云集成深化、开源社区壮大,未来将聚焦性能优化、云原生应用及新兴技术融合,培养更多开发者,驱动软件创新。**
82 1
|
29天前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
35 3
|
16天前
|
开发框架 监控 NoSQL
.NET开源的实时应用监控系统 - WatchDog
.NET开源的实时应用监控系统 - WatchDog
|
18天前
|
人工智能 前端开发 开发工具
.NET技术探析:优势、创新应用及挑战。
【7月更文挑战第4天】**.NET技术探析:优势、创新应用及挑战。本文分三部分展开,阐述了.NET作为统一多语言开发平台的核心优势,如强大的Visual Studio工具、跨平台能力与丰富的类库;探讨了其在企业级、Web、移动及游戏开发中的创新角色;并指出面临性能优化、容器化、AI集成等挑战及未来开源社区驱动的发展机遇。通过理解与应对,开发者可借助.NET推动软件开发进步。**
20 0
|
2月前
|
开发框架 .NET API
在Windows Server 2008 R2上运行.Net 8应用
在Windows Server 2008 R2上成功运行.Net 8程序,需安装三个补丁:Windows Server 2008 R2 SP1 (KB976932)是基础更新;VC_redist.x64提供MSVC库支持;KB3063858解决.NET运行时加载`kernel.dll`的路径问题。KB3063858可能需要KB2533623。详细信息和下载链接在文中给出。
104 4
|
1月前
|
Linux C# C++
【.NET Developer】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
本文介绍了如何使用VS2019和.NET框架创建一个Blazor应用,并将其部署到Azure应用服务。首先,Blazor是一个使用C#而非JavaScript构建交互式Web UI的框架,支持共享服务器和客户端应用逻辑,以及与Docker和Azure集成。任务包括创建Blazor项目,配置Dockerfile为Linux容器,本地测试,发布到Azure Container Registry (ACR),然后在Azure App Service for Container上部署。在部署过程中,需确保Docker设置正确,开启ACR的Admin访问权限,并监控镜像拉取和容器启动日志。
|
2月前
|
C# Windows
一款.NET开源、简洁易用的Windows桌面小说阅读应用
一款.NET开源、简洁易用的Windows桌面小说阅读应用