Code-First或Database-首先,如何select?

让我们假设我们要开始一个新的项目 – 应用程序,其中包含一些业务逻辑,在ASP.NET,WPF或两者的用户界面。 我们希望使用ORM或DAL代码生成器,并在.NET类中实现我们的业务逻辑。 我们如何expression我们的业务领域的想法有几个基本的方法:

  • 在.NET上实现业务类并让ORM生成适当的数据库模式
  • 手动创build数据库模式并通过代码生成器生成.NET类
  • 使用某种可视化devise器,可以生成业务类和数据库结构或脚本

你喜欢写什么:“创build表人(…)”或“公共类人{…}”?
这些方式的优点和缺点是什么?
也许有一些特殊的情况,一种方式比另一种更好?
如何select最佳的方式在一个特定的项目?

我对“先行代码”(或“模式优先”)方式非常熟悉,但似乎大部分ORM被devise为代码生成器或映射器,假设我将手动实现数据库结构和业务类。

基于ORM的expirience和例子的答案是特别受欢迎的。

编辑:请注意,问题不是“我应该先做什么,当开始新的项目?”,但是“应该手动声明/自动生成,域类或数据库结构?

我认为适当的系统分析和devise方法是首先对对象及其关系进行build模。 如果你正在创build一个图书馆系统,你应该把书,作者,出版商,ISBN作为对象而不是数据库表或属性。 我相信这是应该的。 这就是说,让我们承认,代码生成器节省了很多时间,而那些需要一个关系数据库来生成模型,并将其映射到数据库对象。 我认为这是开发人员倾向于由DB开始的主要原因什么可以certificate我的观点更多的是,代码生成器开发人员正在努力扭转当前实现的操作(即提供业务模型 – 对象和类 – 生成器用这个适当的模式创build数据库)。

编辑:
这里是一个域优先生成器的例子(ADO.NETentity framework本身)模型优先 :

Visual Studio 2010必须能够生成一个DDL并创build一个数据库来存储实体数据模型。 开发人员可以完全控制整个过程,可以自定义DDL,或者select他想要的数据库,或者微调映射过程。

为什么不以接口为先?

太多的应用程序从一个程序优先的心态开始。 这是一个坏主意。 编程是构build应用程序最重要的组成部分,这意味着它是最昂贵和最难改变的。 相反,首先从devise开始。

devise比较轻。 一个纸草图便宜,容易改变。 htmldevise还是比较简单的修改(或丢弃)。 编程不是这样的。 先devise让你灵活。 编程首先会阻止你进入并为你提供额外的成本。

这是从“ 获得真实的”37信号的第9章 。

“给我看你的stream程图,把你的桌子藏起来,我会继续困惑。 告诉我你的桌子,我通常不会需要你的stream程图; 他们会很明显的。“

– 弗雷德布鲁克斯在“神话人月”

在我看来,这是没有正确的答案。 我想这主要归结于你自己的个人或你的团队喜好。 所有提到的方法(数据库优先,代码优先,接口优先)都有各自的优点和缺点。

我可能会坐下来用笔和纸画出一般结构和应用程序的主要function,然后再做任何特定的事情,不pipe是代码还是数据库表。 基本用户界面的简单绘图也有很大帮助。

首先分析需求,然后对这些需求进行一些文档分析,并对这些数据方面进行概述。

然后你知道你将要捕获什么数据以及它如何与其他数据相关联,并且可以devise数据库模式或数据结构来匹配它(作为相关内容的逻辑对象/表格,而不是“tab1_data”,“tab2_data”数据捕获过程可能会改变,但你知道!)。 你甚至可以先devise一个.xsd,然后从中生成代码和数据库模式。 这些都是有趣的游戏,取决于你的技能。

由于我脑海中的数据库模式存储数据,这对企业来说是非常重要的事情,所以我会devise第一个 – 多个工具可以及时访问,也许最初的系统将被replace掉(例如, ,迁移到更新的工具/语言/界面)。 如果你对数据库理论一无所知,那么也许这不是你最好的select,但我仍然会得到任何生成的模式被别人validation。

在大多数情况下,这并不重要。 个人喜好和技巧要比其他任何东西都要高。 大多数应用程序不会受到太多的影响,无论您的团队是否适应,都可以使用。 select真正重要的地方应该是明显的方法。

也就是说,我个人的看法是,“数据库第一”通常是更安全的select。 如果数据在任何方面都很重要,特别是在特定应用程序范围之外的情况下,您希望完全控制数据的存储方式。

“代码优先”(隐含着:把数据库留在一些自动工具的手中)在我脑海里确实是一个捷径,你应该使用的时候(而且只有当)你确定你可以逃避它。

要回答你编辑的问题(手动db / auto类或手动类/ db),我会select“既不”。 自动生成的两种代码都是由于许多原因而被避免的,首先是YAGNI。 你最终得到的代码是你从来没有写过但仍然是负责的代码,你永远不会使用的代码,并且(根据我的经验)代码,你最终将花费更多的时间重构,比如果你自己devise和编写地点。 而且他们都将注意力集中在远离最重要的位置 – 用户。

首先不要直接思考,而应该从用户的angular度来看“模型”(最好在纸上)你的应用程序将具有哪些部分。

如果您对该模型有清晰的认识,则可以将这些部分划分为可以转换为对象定义和数据库表的通用和特定的小元素。

我发现这种方法显着减less了数据库规范化的时间和精力。

我个人喜欢对创buildRDBMS对象的控制。 当我首先使用EF代码时,它实际上为表格关系等基本事物创build了更多的工作,这些代码生成器可以为您提供很多体面的代码(我知道这是个想法,可以更好地控制您的模型! 。 另外EFCF将会生成我希望的数据库的想法有点吓人。 (传统上Code更容易发展,然后RDMBS!)

对于一个需要不断发展的系统(例如SaaS),通常是一个有500多个表格的大型企业级系统,这个系统的吸引力可能会降低。 另一方面,如果你有一个合适的SQL Server 2008数据库项目,所有的表,SP,触发器,索引都是脚本化的,你可以从Visual Studio中部署它,这样可以pipe理得更好。 你现在可以自由地使用任何你想要的代码为你的表(甚至build立自己的)

你没有绑定到框架(EFCF),你可以使用不同的ORMs(例如NHibernet),这取决于你的大型系统中的“迷你”项目需求。

开发数据库应用程序时需要考虑3个重要方面…

  1. 用户体验
  2. 数据质量
  3. 维护前两项(用户体验和数据质量)的成本

我相信这三个项目的优先顺序是按照它们所呈现的顺序表示的,这意味着最高的优先级是用户体验,第二优先级是数据质量,第三个是这样做的成本。 当然这些可以辩论,但代码优先或数据库优先的概念是相对于第三个优先事项 – 成本。 无论select什么 – 首先编写代码或数据库,确保前两个优先事项得到满足…