到目前为止,我一直在使用带有Linq到MV的MVC3,以便所有模型都已预先生成,我自己创建数据库,然后将表移到dbml编辑器上,如果我想更改表,我会删除编辑器上的实体并再次将其拖动。它工作得很好,但我注意到微软正在继续使用EF,我也应该了解这一点。
所以,在阅读了一些文章之后,我完全感到困惑。我想从Code First方法开始,据我所知,这使得开发人员首先为实体创建模型,然后模型创建数据库。这里最令人困惑的是,当我更改模型时,在运行时将模型与实体进行比较时,如果确定两个不相同,则会删除所有表并重新创建它们。如果是这种情况,我该如何保留我的数据?如何存储我的所有表格,以免它们被丢弃?我应该使用“数据库优先”方法吗?
请帮忙。谢谢!
答案 0 :(得分:4)
您完全正确地查看实体框架而不是Linq To Sql。微软专注于EF,这是可行的方法。实体框架有三个选项:
首先使用数据库,您可以使用现有数据库为您创建模型。这是在设计器中完成的,它将向您展示模型的外观以及修改实体和数据库之间映射的位置。
模型首先以空设计师开始。您创建实体,然后让实体框架为其创建数据库模式。
使用Code First,您没有设计师。相反,您可以在代码中创建实体,并且在运行时,实体框架会创建从实体到数据库的映射。这是通过一些约定(例如每个实体到它自己的表,Id属性作为主键)和您可以添加的自定义映射来完成的。
从Linq To Sql背景,模型第一/数据库首先可能听起来很熟悉你。 Code First是一种新的方式,吸引那些想要创建纯粹POCO的干净域模型的人。他们专注于代码,而不是数据库。
你可以试验这三个。它们都有一个共同的基础和一些额外的功能。
Code First在创建数据库时会有很多选项。 Here您可以找到一些有助于入门的信息。您每次都看到数据库被删除并重新创建的原因是由于数据库初始化程序。您可以使用多种方法来创建,重新创建和更新数据库。
在开发环境中,最简单的方法是在每次模型更改时删除并创建数据库。您还可以使用一些初始测试数据为数据库设定种子。在生产环境中,您将使用“代码优先迁移”在每个模型更改上迁移数据库,以便保留数据。
答案 1 :(得分:1)
如果确定两个不相同,则会丢弃所有表格 重新创造它们。
默认情况下,您将获得一个例外。您必须明确指示应用程序删除并重新创建数据库。 我没有EF代码的第一次经验(只有db第一次),但我不喜欢在生产中删除和重新创建数据库。在开发过程中,这应该没问题。
如何保留我的数据?
更多链接:
答案 2 :(得分:1)
默认情况下,代码首先会抛出异常。听起来您已创建(并设置)“drop或recreate”初始化程序(IDatabaseInitializer),这会导致数据库的强制重新生成。您可以构建不同类型的初始值设定项,其中一个是EF 4.3.1的新增功能,允许db migration而不是删除和重新创建。