EF 4.1仅限代码优先?

5
据我所知(如果我错了请纠正),使用Entity Framework有两种主要方法:
  1. Model First:从预定义的数据库开始,让EF为您创建代码。
  2. Code First:编写代码,让EF为您创建数据库。
我有一个现有的数据库,并且想自己编写代码。这种"仅限代码"的方法受支持吗?在EF的上下文中,这种方法是否有意义?

可能是我眼花了,但是我看不到这里的问题? - Mitch Wheat
@Mitch Wheat:我不想让EF为我生成数据库或代码。有没有办法手动进行映射? - MCS
如果EF没有生成任何内容,那么你就不需要EF。 - Mitch Wheat
@Mitch Wheat:我想使用EF作为ORM工具,这样我就可以针对我的业务对象进行编程,让EF处理查询和更新数据库。我以这种方式使用过Linq-to-SQL,效果很好。 - MCS
1
@MCS:她建议在这种情况下使用Code First,因为你可以(在某种程度上)轻松地编写代码来映射现有的类到数据库模式,从而避免完全抛弃已经定义好的所有类。请参见我的回答以获取更多详细信息。 - StriplingWarrior
显示剩余2条评论
5个回答

5
我不同意其他答案的大部分观点。根据我所见,EF的“Code First”技术实际上只是一种使用约定、注释或流畅的映射定义来定义模型的方法,而不是使用EDMX文件。如果您编写“Code First”文件以反映数据库模式,那么Entity Framework将能够使用LINQ to Entities生成适当的查询和语句。
有关更多信息,请参见Scott Guthrie在使用现有数据库的EF“Code First”一文中的介绍。

我记得以前看过那篇文章,但不理解在现有数据库上创建“Code First”(或者是“Code Second”)的意义所在。看起来他只是手写了可以通过模型优先方法生成的相同代码。当然,他是 EF4 的负责人,我不会质疑他。只是想说我不明白。 - Jerad Rose
@StriplingWarrior - 好的,我能理解。但我正在尝试将其与OP的情况相匹配。他没有现有的类(声明他想自己编写代码),所以也许他只是不喜欢生成的代码。我不知道,我仍然很难理解为什么有人会更喜欢手动编写现有数据库的实体,只是为了不使用生成的代码。对我来说,这似乎是一种倒退的思维方式。但我想每个人都有自己的偏好。 :) - Jerad Rose
@Jerad Rose:“我们的任务不是质疑为什么...”;-) - StriplingWarrior
1
@MCS - 你可以考虑查看一些来自EF4 POCO T4模板的示例代码。它实际上相当轻量级,而且你可能会发现它非常类似于你最终将手写的代码。正如我所说,如果你正在使用ORM,它的很大一部分目的是为了节省你在创建数据库和映射现有实体或创建实体和映射现有数据库方面的重复劳动。 - Jerad Rose
1
我可以想到一些更多的原因,为什么你会想使用Code First并手动创建数据库。首先,你可以完全控制数据库模式、映射逻辑和实体。这里有些人说“那就别用EF了”——但是EF的主要目标是ORM,而不是代码生成。此外,EF的“EDMX”设计师界面对于任何具有超过大约8个表的数据库来说都很糟糕。它非常慢,并需要专门的连接字符串。也很难进行单元测试。Code First在正式的DB发布流程必须要求的生产场景中使用起来很困难。 - ShadowChaser
显示剩余3条评论

2
Entity Framework Power Tools可以将数据库反向工程化,生成类似于Code First的代码(不会重新生成数据库)。然后您可以根据需要进行调整。 点击此处获取更多信息。

有趣。这个和使用Model First POCO T4模板有什么区别? - Jerad Rose

1

我认为您需要决定您的参考系统是什么 -- 代码(Code First)还是数据库(Model First)。如果您已经有了一个现有的数据库,那么采用 Code First 方法,要想在不从代码或模型中生成模型的情况下保持更改同步是很困难的。

如果您已经有了一个现有的数据库,但想要将模型扩展到生成的代码之外,那么您可以实现部分类来完成这个任务。

如果您想要手动映射 EF4 代码和数据库,您可以考虑 this approach。然而,这会消除 ORM 的一些好处,即为您设置映射。


1

在这种情况下,我想你不能两全其美 - 必须有一个明确的来源来确定你的模型,它可以是数据库(DB first),然后为你生成匹配的代码,或者是代码(Code first),然后创建匹配的数据库。


EF作为ORM工具不是很有用吗?它是否需要生成代码或数据库才能发挥作用? - MCS
ORM 的定义是,它基于某种模型为您生成数据存储库的代码。 - Mitch Wheat
数据库可以成为您的一个明确来源,而不需要从中自动生成类。@Mitch Wheat:实体框架仍然可以处理数据存储库的管道,而无需自动从数据库模型生成类。 - StriplingWarrior

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接