写点什么

存储过程与 Entity Framework

  • 2012-08-09
  • 本文字数:1117 字

    阅读完需:约 4 分钟

人们已经写过许多以对象关系映射(ORM)工具及其种种问题为主题的文章。大多数反对意见可归为两类:关注点分离和面向对象设计。对于 Entity Framework(实体框架)而言,我们有些好消息。

关注点分离(Separation of Concerns)

存储过程(Stored Procedure)不仅仅是将多得简直荒唐的业务逻辑塞入数据库的一种方式;它还是避免将多得简直荒唐的存储逻辑塞入应用程序层(application layer)的一种方式。它使得应用程序可被视为理想的数据表现,同时又不会泄露数据库管理员(DBA)的神机妙算。各种各样的暂存表、非规范化的报告表、视图、以及表函数都被隐藏在简单的存储过程调用背后,从而形成了数据库的公共应用编程接口(API)。注意,从微小的性能调整到全面重构的一切都可以完成,且无须重新部署许许多多依赖于该数据库的应用程序。

对于接下来的两个版本,Entity Framework 打算让使用存储过程变得更容易。在即将发布的版本 5 中,我们发现急需表值(Table-valued)函数,以及往模型中批量导入存储过程的能力。

表值函数(Table-valued functions,缩写为TVF)与对象关系映射工具的配合可谓天衣无缝。与普通的存储过程或视图相比,表值函数则要灵活许多,不过离开了动态SQL 语句生成,那么就无法充分利用它们了。而且实际上,SQL 语句生成是将对象关系映射从被美化的数据映射器中分离出来的关键功能。

遗憾的是,只有开发者可以使用这些建模工具。如果你正在用Entity Framework 的Code First 技术,那么你必须一直等到 Entity Framework 6 才能获得某种形式的存储过程支持,而对表值函数的支持就更别提了。

面向对象设计(Object Oriented Design)

面向对象程序设计是个棘手的话题。从本质上讲,对象关系映射工具希望简化为数据传输对象(Data Transfer Object,DTO)风格的一些对象,即拥有默认构造函数和公共属性,从而对象关系映射工具就可以分层执行延迟加载、跟踪变更等等。但是那些偏爱面向对象设计的开发者往往喜欢拥有复杂构造函数、以及有限的公共接口的复杂对象(rich object)。譬如CreatedBy(创建者)或CreatedDate(创建日期)这样的列应该用只读字段和相应的属性来表示,因此就没有机会意外更改它们的值了。

遗憾的是,我们近期内将不会看到这种情况。你可以使用私有设置器(private setter)来完成某些事情,但总体而言,与真正的业务对象相比,实体仍然还是更像数据传输对象。长期来看,自定义Code First 约定(Custom Code First conventions)会有所帮助。这个有前途的功能本打算成为EF 4.1 的组成部分,但是由于该设计的复杂性而被砍掉,而且总体感觉它只是没有准备好。Sergey Barskiy 写了一篇文章来说明本打算做些什么

查看英文原文: Stored Procedures and Entity Framework

2012-08-09 13:494795
用户头像

发布了 55 篇内容, 共 20.4 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

如何优雅滴在手机上跑Python代码

wangkx

Python 移动应用 手机编程

学习来应对创业的未知

Neco.W

创业 重新理解创业

怎样算是一个好的开发者?

水滴

开发者

使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源

mzlogin

CDN Jekyll GitHub Pages 个人博客

阿里巴巴Java开发手册泰山版解读

Bruce Duan

死磕Java并发编程(7):读写锁 ReentrantReadWriteLock 源码解析

Seven七哥

Java并发 读写锁 ReentrantReadWriteLock

多云的一点思考

HU

消息队列Kafka - acks参数

Java收录阁

kafka

DDD 实践手册(2. 实现分层架构)

Joshua

设计模式 领域驱动设计 DDD 系统架构 分层架构

InfoQ写作平台首秀,来个自我介绍

nuhcoad

个人感想

KubeFATE: 用云原生技术赋能联邦学习(一)

亨利笔记

人工智能 学习 FATE KUBEFATE

说出来就不灵啦

伯薇

糊涂 活在当下 享受状态 生活状态 观察者

Java并发编程系列——锁

孙苏勇

Java Java并发 并发编程 多线程

MySQL中order by语句的实现原理以及优化手段

天堂

Java MySQL 性能优化

Netty 源码解析(四): Netty 的 ChannelPipeline

猿灯塔

把成功过成自己的生活

子铭

成功学 生活状态

MySQL的死锁系列- 锁的类型以及加锁原理

程序员历小冰

MySQL

高仿瑞幸小程序 00 准备工作

曾伟@喵先森

小程序 微信小程序 大前端 瑞幸

韦小宝真的幸福吗 | Random Forest

张利东

Python 学习

即将步入职场,忐忑而又期待的新人菜鸟

菜农阿飞

成长 新人

游戏夜读 | 2020周记(3.27-4.3)

game1night

关于5G RCS的产品猜想

机器鸟

Day 47|Week 07-5 曾国藩家书|问学篇-学问何处何时都可做

熊小北同学

神经网络的激活函数为什么要使用非线性函数

wangkx

神经网络 激活函数

浅析 Cocoapods-Packager 实现

Edmond

ruby ios CocoaPods binary packager

从数据闭环谈微服务拆分

松花皮蛋me

微服务

为什么正在使用的Java版本跟环境变量的版本不一致

阡陌r

Java 踩坑

程序员陪娃漫画系列——魔方

孙苏勇

程序员 生活 陪伴 漫画

HashMap 的 7 种遍历方式与性能分析

Bruce Duan

Java 性能 hashmap 遍历

南丁格尔科普

小匚

经济大萧条对我的启示

Neco.W

创业 自我管理 职场 自我提升

存储过程与Entity Framework_.NET_Jonathan Allen_InfoQ精选文章