2012-09-14 149 views
2

我们使用没有Edmx文件的代码优先的方法,它的运行良好,第一次创建数据库。代码第一次数据库迁移

但是,如果我添加新的数据实体说新的类到我的数据库上下文然后它不能将它添加到该数据库中的新表。

举例说,在数据库中最初有两个表。 EX数据库:DbTest

表:TBL1,TBL2

现在,如果我添加新表,说类名称“TBL3”,那么就应该将它添加到现有的数据库。

任何人都可以向我解释一下如何通过代码优先的方法来实现吗?

我见过提到类似Database.SetInitializer(new ........)

我需要什么就摆在上面构造的空白区域?

回答

1

如果你看看你的数据库,你会看到一个名为“EdmMetadata”的表,Entity Framework用它来确定自从数据库创建以来(在你的情况下)你的模型是否有任何改变。

默认行为是在模型和数据库不同时引发异常。要获得不同的行为,您需要使用IDatabaseInitializer<TContext>

幸运的是,实体框架附带此接口的一些默认的实现:

  • CreateDatabaseIfNotExists<TContext> - 如果不存在这将创建数据库。
  • DropCreateDatabaseAlways<TContext> - 每次运行应用程序时都会重新创建数据库。
  • DropCreateDatabaseIfModelChanges<TContext> - 如果在EdmMetadata表中检测到更改(通常是创建新表的结果),将重新创建数据库。

你当然也可以通过覆盖InitializeDatabase方法来创建你自己的这个接口的实现。

使用这些初始化策略的一个示例如下所示:

Database.SetInitializer(
    new DropCreateDatabaseIfModelChanges<NameOfYourDbContextClass>()) 

选择,你可能最终会失去已经进入到数据库中的数据初始化策略之前,请仔细想想,这可能不是什么你要。

由Entity Framework提供的实现提供了一个Seed方法来为您的数据库加载数据,以便您可以在每次创建数据库时使用默认数据预加载数据库。

This文章提供了更多信息。

相关问题