EF模式首先或代码优先的方法?
我知道这个问题之前已经被问过无数次了,因为我已经阅读了很多关于利弊的文章,但是我仍然不能确定哪种方法适合我。 我对networking编程非常陌生,来自SQL DB Admin /报告撰写背景。 我已经决定尝试build立自己的网站,这个网站可能会在将来有30-40张桌子。
我已经看过两种方法,我喜欢实体模型的方法,因为我喜欢简单的devise师,我喜欢看到整个模型在我面前,它显示在一个快照的整体画面。 此外,我不是一个强大的程序员,我对它使用DbContext生成器模板生成POCO的方式留下了深刻的印象,并且完成了类之间的所有连接。
但是,尽pipe我喜欢模型优先方法,但是我觉得还有一些缺点,我不确定它们是否存在实际缺陷,或者我对模型第一方法和代码优先方法不够了解,因为我仍然很新的这个。
我对使用模式优先方法犹豫不决的原因是:
– 主要是因为我在使用MVC 3的模式第一种方法上苦苦寻找教程。我发现使用DbContext的最好的教程是Julie Lerman,但是她并没有介绍使用数据注释和使其他在您重新生成POCO时不会丢失的更改。 大多数与MVC 3相关的教程似乎都使用了代码优先的方法。 大多数人认为这是因为导师不想把重点放在EF上,而是显示出更多的MVC。 我个人认为这是因为微软在其他方面支持Code First方法:)
– 如果创build好友类是一个好习惯,为什么我找不到很多教程来展示MVC 3? Buddy类是View Models的另一个名称吗? 为什么我无法find任何教程由微软显示这些好友/视图模型使用MVC 3?
– 我试图做两个表之间的基本1对1关系。 在模型中,首先必须将每个表的身份关键字设置为相同的字段,而不是在其中一个表中使用FK,当您有3个或更多表通过1对1关系相互关联时,可能会有点混淆。 在代码中,第一个方法是使用模型构build器并手动进行设置。 我想在MF中,你可以通过进入我根本不想做的XML来改变关系。
– 对代码优先问题的更多支持/帮助
我犹豫使用Code First方法的原因是:
我是一个新手编码器。
– 随着项目的扩展,我们很难跟踪表格和关系。
– 没有模型图,我不得不说我真的喜欢这个想法。
– 通过configuration类映射实体到数据库我觉得不可能:)。
更新表格将需要更改代码和数据库。 在模型中,首先只有一个模型会自动更新数据库和代码,说如果你使用好友类,你也可能需要更新这些。
现在我也看到有些人将Code First和Database第一种方法结合在一起,因为您不要让Code First生成数据库,而是手动创build数据库,并使用代码第一个API来获得它。
我的脑袋正旋转着所有的select和弊端,利弊。 我只是想创build我的网站,而不是思考采取哪种方法。 任何人都可以根据我所说的和/或他们认为未来更主stream的方式,给我一些他们认为最好的方法的见解吗?
非常感谢戴夫
这个问题太长了。 下次你应该把你的问题分解成多个单独的问题。
代码优先x模型优先x数据库优先
你是一个数据库的人,所以最好的方法是一个增量数据库优先的方法,你在DB(或VS数据库工具)中定义的东西,并从数据库更新模型。 这将使您对数据库有很大的控制,并允许您逐步构build应用程序和数据库。 为什么我认为你会喜欢它:
- 你以前做过SQL DBpipe理员 – 你可能知道关于数据库的一些事情,以及如何devise他们的performance – EF不会为你做任何事情。 EF不会为你创build索引等
- 30-40桌意味着你不会在一个拍摄中build立模型。 你将从小模式开始,不断发展壮大。 一旦开始在数据库中进行更改或添加初始化数据,您将不希望丢失这些更改和数据。 代码优先只允许删除整个数据库并重新创build它。 Model-first允许增量构build数据库,但您需要实体devise器数据库生成电源包和VS 2010 Premium或Ultimate($ 5.000- $ 10.000)。
关于DB之间的区别首先,Model首先和Code第一 。 另一个答案描述了代码优先与devise师之间的区别 。
DbContext API +数据库优先+ Fluent映射
我会把这称为最难走的路。 您将首先定义数据库,您将使用DbContext fluent API或数据注释来定义映射。 这需要对EF和映射背后的所有原理有所了解,并了解DbContext API中使用的默认约定。 它会给你很好的和明确的控制映射,但它是最要做的工作。 这绝对是最难走的路。 此外,它不是假定使用,因为DbContext API主要是为代码优先的方法创build的。
DbContext API x ObjectContext API
一旦开始使用EDMX(实体devise器),您可以select使用DbContext Generator T4模板或POCO Generator T4模板。 决定取决于你 – 你可以使用DbContext API(第一个模板)或ObjectContext API(第二个模板),这是更好的logging,你也可以使用两本很棒的书:
- 编程entity framework
- entity framework接收
我所知道的ObjectContext API来自这些书籍,作者的博客和practice + Reflector。
DbContext API目前没有任何书。 你可以检查一些主要的网站来获得关于它的信息:
- ADO.NET团队博客
- Julia Lerman的博客
- Morteza Manavi的博客
我所知道的DbContext API来自这些博客和练习+reflection器。
即使您先使用代码,您仍然可以使用类图来可视化您的类图(与EDMX不一样,但足以获得大图)。
search堆栈溢出或MSDN论坛将为您提供有关这两个API将遇到的大多数问题的答案。
MVC 3
在MVC 3中使用entity framework没有什么特别之处。用于数据validation注释的Buddy类被认为是不好的做法。 伙伴类是单独的类,用作实体上应用的元数据持有者。 视图模型是用于在控制器和视图之间传输数据的类。 视图模型应该具有特定的视图和自己的validation注释,因为在使用相同的实体types时,通常需要在应用程序的不同屏幕上进行不同的validation – 例如编辑和插入屏幕可以有不同的validation要求。
尽pipe事实上它并不被认为是一种好的做法,但是可以向实体添加validation – 您可以为每个实体手动创build好友类,也可以尝试修改T4模板来直接为您生成注释(这很难) 。
一对一的关系
是的,EF需要在主键上创build一对一的关系。 原因是EF不支持唯一的键/约束。 这是没有办法的,在数据库中使用唯一的键不会改变它。
这相对简单 如果您不关心数据库模型,请先使用代码。 如果你这样做,首先使用模型(或数据库优先)。 这取决于你的重点在哪里,以数据为中心还是以代码为中心。
我已经看过两种方法,我赞成实体模型的方法,因为我喜欢简单的devise师,我喜欢看到整个模型在我面前,它显示在一个快照的整体画面。 此外,我不是一个强大的程序员,我对它使用DbContext生成器模板生成POCO的方式留下了深刻的印象,并且完成了类之间的所有连接。
+
通过configuration类将实体映射到数据库我觉得不可能:)。
=先使用模型
如果创build好友类是一个很好的习惯,为什么我找不到很多教程来展示MVC 3? Buddy类是View Models的另一个名称吗? 为什么我无法find任何教程由微软显示这些好友/视图模型使用MVC 3?
这可能是因为代码优先是块中的一个新的孩子。 这就是为什么大多数代码优先的MVC3教程。 在MVC2时代,Model-first是“年代久远”,可能是最受欢迎的解决scheme。
顺便说一句:你已经知道我的oppinion,你应该使用,你最喜欢或find最舒适的(正如我告诉你上次你问这个问题),但我只是想在这里添加一些东西:)
评论后编辑:
看看这些东西,这将有助于你的代码首先很多imo:
为ASP.NET MVC应用程序创build一个entity framework数据模型(1 of 10) 使用MvcScaffolding包构build您的ASP.NET MVC 3项目
++这些来自MIX11频道9的精彩video:
斯科特·汉塞尔曼(Scott Hanselman)通常会用他那令人敬畏的方式展示新东西
史蒂夫桑德森显示MvcScaffolding的力量
如果这是模型的首要问题,那么可以从任何版本的MVC中使用模型的第一个示例。 MVC处理“模型”的方式在各个版本中并没有太大差别。 当然,视图模型等有增强function,但是对于较老的教程你应该没问题。
我首先喜欢代码,因为我觉得有数据库模型和领域模型,他们服务于不同的目的。 数据库组织是针对数据库的性能和大小,而不是帮助您的应用程序。 拥有自己的模型可以让您专注于应用程序中的状态需求,而不pipe数据库如何。
现在,你可以先从模型中得到这个模型,但是你更可能以这种方式考虑数据库比你的需要…尤其是, 如果你是这个新手。
只是我2美分。