1

到目前为止,我一直在使用带有 Linq to Sql 的 MVC3,以便预先生成所有模型,我会自己创建数据库,然后将表移动到 dbml 编辑器上,如果我想更改表,我会删除实体在编辑器上并再次拖动它。它工作得非常好,但我注意到微软正在大量使用 EF,我可能也应该学习这一点。

所以,看了一些文章后,我完全糊涂了。我想从 Code First 方法开始,据我了解,它使开发人员首先为实体创建模型,然后模型创建数据库。这里最令人困惑的是,当我更改模型时,以及在运行时将我的模型与实体进行比较时,如果它确定两个不同,它会删除所有表并重新创建它们。如果是这种情况,我该如何保存我的数据?如何存储我的所有表格,以免它们被丢弃?我应该改用“数据库优先”的方法吗?

请帮忙。谢谢!

4

3 回答 3

4

您完全正确地查看实体框架而不是 Linq To Sql。微软专注于 EF,这就是要走的路。实体框架具有三个选项:

  • 数据库优先
  • 模型优先
  • 代码优先

首先使用数据库,您有一个现有的数据库,可用于为您创建模型。这是在一个设计器中完成的,它将向您展示您的模型的外观以及您可以在哪里修改实体和数据库之间的映射。

模型首先从一个空的设计师开始。您创建实体,然后让实体框架为其创建数据库模式。

使用 Code First,您无需设计师。相反,您在代码中创建实体,并且在运行时实体框架会创建从您的实体到数据库的映射。这是通过一些约定(例如每个实体到自己的表,Id 属性作为主键)和您可以添加的自定义映射来完成的。

从 Linq To Sql 的背景来看,模型优先/数据库优先对您来说可能听起来很熟悉。Code First 是一种新方法,它吸引了想要创建纯粹 POCO 的干净域模型的人们。他们专注于代码,而不是数据库。

您可以尝试所有三个。它们都有一个共同的基础和一些额外的功能。

创建数据库时,Code First 会有很多选择。在这里,您可以找到一些有助于入门的信息。您看到您的数据库每次都被删除和重新创建的原因是因为数据库初始化程序。您有多种创建、重新创建和更新数据库的选项。

在开发环境中,在每次模型更改时删除和创建数据库可能是最容易的。您还可以使用一些初始测试数据为您的数据库播种。在生产环境中,您将使用 Code First 迁移在每次模型更改时迁移您的数据库,从而保留您的数据。

于 2012-07-28T20:19:09.930 回答
1

如果它确定两个不相同,它会删除所有表并重新创建它们。

默认情况下,你会得到一个异常。您必须明确指示您的应用程序删除并重新创建数据库。我没有 EF 代码第一次体验(只有 db 第一次),但我不喜欢在生产中删除和重新创建数据库。在开发过程中,这应该没问题。

如何持久化我的数据?

使用代码优先迁移

更多链接:

EF 4.2 代码优先演练

实体框架主页

于 2012-07-28T19:57:55.523 回答
1

如果您的模型与您的数据库不匹配,默认情况下代码优先只会抛出异常。听起来您已经创建(并设置)了一个“删除或重新创建”初始化程序(IDatabaseInitializer),这会导致数据库的强制重新生成。您可以构建不同类型的初始化程序,其中一种是 EF 4.3.1 新增的,它允许数据库迁移,而不是删除和重新创建。

于 2012-07-28T20:03:26.357 回答