不管作者提倡怎么做,他的观点非常合我的脾胃,因为我本身就认为ORM是个累赘,食之无味:
==========================================================================
在使用ORM构建基于数据库的项目时,开发者可以选择是先设计数据库表,还是先设计类或抽象模型。为了展开讨论,我们先列出Frans Bouma的结论:代码先行的ORM是愚蠢的。
先写代码,比如实体类,与先设计表一样有问题,它们都需要反向工程来得到抽象实体定义,以创建“对方”的元素:对类进行反向工程得到抽象实体定义,然后创建表和映射,或对表进行反向工程得到类,然后创建映射,这两者是等价的。核心问题是,如果先设计类或表,就等于先得到了抽象实体定义的某个投影的最终结果:类不是从天上掉下来的,在决定了领域包含这样一个类型后,它就存在了。例如,一个“Customer”,包含给定的字段:Id、CompanyName、Address等。
他还说道,
我知道“代码先行”的整个思想来源于开发者希望编写代码,用代码来思考,然后将对象持久化到数据库中。但事实是,你持久化到数据库的并不是对象,而是它们的内容,是实体的实例。而一个实体类的实例(即一个对象)则很有可能比实体的实例包含更多的数据,所以看似存储“对象”,实则无法覆盖对象。拿序列化一个对象来打比方,我们序列化的并不是对象,而是其数据的子集,得到的结果与源并不一定匹配。在将数据反序列化为JavaScript对象的时候,我们还能将它视为原始的.NET对象吗?当然不能,它是对象内部的数据,可以存在于任何地方。
那么,当“对象”序列化成JSON时,数据被序列化,这没有异议。但当同样的对象序列化成表行时,对象作为一个整体被序列化,这不是更奇怪吗?如果你仍然坚信ORM就是持久化对象,那么另一个不使用ORM但使用相同数据库的应用程序,在将“对象”持久化为表行时会发生什么呢?这个应用程序(甚至可以用完全不同的语言编写)可以完全正常地读取和消费存储于表行中的实体实例,不需要知道你将其视为一个持久化的.NET对象。因为让人惊奇的是,表行中的内容并不是持久化的对象,而是持久化的实体实例,一个抽象实体定义的实例,不是类定义的实例。
Reddit用户remy_porter对这个问题有不同的看法,
我认为真正糟糕的是EF中的模型先行(Model First)。我痛恨它强制你使用的GUI工具。
我最喜欢的方式是用代码先行来实现一种殊途同归的方案。我以最有意义的方式编写对象模型,再以最有意义的方式编写数据库模型,然后使用FluentAPI来让两者匹配。
不过我承认,我用这种方式只是漫无目的地抛出数据库对象图,因为我告诉过管理层这个应用应该使用NoSQL,但他们却充耳不闻(该数据模型是存储不同结构的文档,但却要求用SQL Server)。
Nishruu倾向于将其用于测试,
没错,我通常使用Fluent API来映射已经设计好的数据库。
代码先行真正有用的场景,是用内存SQLite DB或某种LocalDB来快速进行集成或单元测试。然后可以为测试概括而快速地重新创建数据库结构。
NHibernate就很好,能和内存SQLite DB很好地工作。EF就不尽如人意了,使用LocalDB时只能通过MDF文件重新创建数据库架构(schema)。
相关推荐
.NET Core手写ORM框架专题-代码+脚本
### .Net-ORM框架-三层架构完整程序代码 #### 一、概述 本文将详细介绍如何构建一个基于.NET平台上的对象关系映射(Object-Relational Mapping,简称ORM)框架,并结合经典的三层架构来实现一个完整的应用程序。三...
标题"PyPI 官网下载 | django-orm-sugar-0.9.0.tar.gz"指的是从Python Package Index (PyPI) 官方网站上下载的一个名为"django-orm-sugar"的软件包,版本号为0.9.0,其打包形式是tar.gz压缩文件。PyPI是Python开发者...
ORM框架-三层架构完整程序代码.pdf
在 `hsweb-easy-orm-master` 压缩包中,通常会包含项目的源代码、文档、配置文件等资源。开发者可以解压这个文件,研究其内部结构,学习如何集成 HSWeb-Easy-ORM 到自己的项目中。通常,源码会分为几个主要部分:...
资源分类:Python库 所属语言:Python 资源全名:SQLAlchemy-ORM-tree-0.0.7.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
赠送jar包:spring-orm-5.0.8.RELEASE.jar; 赠送原API文档:spring-orm-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-orm-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-orm-5.0.8.RELEASE.pom;...
通过这个“ORM框架-三层架构”的项目,你将能够学习到如何结合ORM框架与三层架构,实现一个完整的应用程序,理解各层间的交互方式,以及如何通过ORM框架高效地操作数据库。这将有助于提升你在实际项目开发中的能力,...
Python库“morm-1.1.4-py3-none-any.whl”是一个用于Python编程的重要组件,它属于Python开发语言中的一个特定模块。在Python的生态系统中,库(或称为模块)是开发者用来扩展标准库功能、实现特定任务的代码集合。...
在"ORM-Delphi-master.zip"这个压缩包中,我们可以推测这可能是一个针对Delphi的ORM框架的源码仓库。下面将详细介绍ORM在Delphi中的应用以及可能包含的相关内容: 1. **对象关系映射原理**:ORM的核心思想是将...
《Python库 | python_redis_orm-0.4.0-py3-none-any.whl:连接Redis的ORM框架详解》 在Python的世界里,数据库操作往往需要通过ORM(Object-Relational Mapping)框架来实现,它将数据库操作转化为对Python对象的...
**PyPI 官网下载 | redis_simple_orm-1.1.0-py3-none-any.whl** 在Python开发中,PyPI(Python Package Index)是官方的第三方Python软件包仓库,开发者可以在这里发布和分享自己的Python库。`redis_simple_orm`是...
| mssql_to_python3_orm-1.0.2-py3-none-any.whl"表明这是一个从Python Package Index(PyPI)上下载的软件包,名为`mssql_to_python3_orm`,版本号为1.0.2,适用于Python 3解释器,且不依赖特定的硬件架构(any)。...
`fox_orm-0.1.5-py3-none-any.whl`文件是一个Python的wheel文件,它是预编译的Python包格式,可以直接在Python环境中安装,无需编译源代码。使用`pip`工具,我们可以很方便地将其安装到我们的Python环境中,命令如下...
标题中的“PyPI 官网下载 | apistar_peewee_orm-0.3.0-py3-none-any.whl”表明这是一个从Python Package Index(PyPI)官方源下载的软件包,名为`apistar_peewee_orm`,版本为0.3.0,适用于Python 3解释器。...
额.... 这个资源已经旧了 因为这个资源里面没有详细的文档 而且有些bug没有修正 这个组件的更新版本请大家移步到以下地址下载: http://download.csdn.net/source/2048329 还有这个资源的分数我设置为0
资源分类:Python库 所属语言:Python 资源全名:infi.clickhouse_orm-0.5.4-py2.7.egg 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在压缩包中,"hibernate-orm-master"文件夹很可能是包含了整个Hibernate ORM的源代码仓库,这对于开发者来说是一个宝贵的学习资源。你可以通过阅读源码来理解Hibernate的内部工作机制,比如实体管理、会话管理、缓存...
官方版本,亲测可用