使用Entity Framework 4进行代码优先开发 联系客服

发布时间 : 星期四 文章使用Entity Framework 4进行代码优先开发更新完毕开始阅读15dc352bcfc789eb172dc8db

第五步:更改数据模型

随着我们应用程序开发的推进,我们将继续改进和重构我们的模型。EF 代码优先类库包括一些很好的开发功能,这使我们在开发数据库时更容易协调某些改进。 给Dinner(餐会)模型添加一个新的属性

让我们对我们的Dinner类做一个简单的修改,更具体的说,我们将给Dinner类添加一个新的“Country”属性。

做完改动,让我们在Virtual Studio中按下F5按钮,重新编译并运行应用程序。将会看到下面的这些错误信息:

这些错误信息之所以出现,是因为我们修改了Dinner类的结构定义,我们的模型对象现在已经不再和数据库中自动创建的Dinners表一致了。

当EF自动地为你创建数据库时,默认地会增加一个“EdmMetadata”表,这个表用来记录自动创建数据库时使用的模型对象的形状。

当EF发现你修改过模型对象,并且和之前自动创建的数据库不再同步时,就会出现上面的错误消息。 重新同步数据模型类到数据库

我们有很多同步模型对像和数据库的方式:

?

我们可以手动地更新数据库中的结构(Schema)让它们保持一致。

? ?

我们也可以先删除数据库文件,然后重新运行应用程序,让EF自动重新创建数据库。 我们也可以开启EF 代码优先功能,当数据模型发生任何改变时能够自动更新数据库 。

下面,让我们在NerdDinner应用程序中看看如何使用最后一种的自动更新的方式。 当模型对象发生变化时重新创建数据库(RecreateDatabaseIfModelChanges)功能

在EF 代码优先类库的CTP 4版本中包括了一个非常有用的开发时(development-time)功能,它允许你在任意时刻修改数据模型类,自动重建数据库。当你开启这项功能的时候,EF能够识别用来创建数据库的类模型在何时被改动,何时可以重建你的数据库以匹配新的模型类——你不需要做任何手工操作。

这项功能在你刚开发一个应用程序时特别实用,因为它为你快速地重构你的模型代码带来了很大的自由度和灵活性——你根本不用去手动地保持数据库结构的同步。它特别适合SQL CE,因为SQL CE是一个基于文件的数据库而且可以随时在运行时删除和创建。这使得开发流程变得不可思议的流畅。

启用这项功能最简单的方法就是在Global.asax类中的Application_Start()事件处理函数中加上Database.SetInitializer()方法的调用。

这个调用告诉EF当数据模型发生任何变化时,重建NerdDinners.sdf数据库以匹配NerdDinners类。现在当我们重新运行应用程序的时候,再也不会出现提示说类模型和数据库不匹配的错误信息了。反而,EF会自动重建数据库以匹配新的数据模型类,我们的应用程序会正常运行:

为自动创建的数据库产生初始化的数据

在上面的截图上,你可能已经注意到我们之前添加的餐会数据在重建数据库之后就丢失了。这是因为根据模型变化自动重建数据库的功能并不适用于实际场合,此时你想将已经存在的数据从一个数据库移植到另外一个数据库中。相反,它是被设计用来适用于开发场合,我们需要数据库结构能快速地自动更新——而不是通过手动地或指定移植规则来实现。

注意:我们另外正在做的工作,用来提供更好的数据移植服务,支持这种适用于产品数据和数据库结构的版本管理。但我们想这和前面讲的前期开发时(development-time)功能是不同的场景。这种数据移植的功能现在还不会在这个星期的CTP上发布。

其实,EF已经为我们提供了可选的 “种子” 功能,用以在创建或者重建数据库时产生默认或测试数据。我觉得这个功能真的很实用,因为这样一来,在我重构一个数据模型后,马上就可运行应用程序去测试—不用重新手动地输入一堆的测试数据。

我们可以通过实现一个如下所示的“NerdDinnersIntializer”类,将这些“种子”数据到加入到数据库当中。我这里用它创建两个“示例餐会”并把它们加入到数据库中。