代码首次数据库迁移

时间:2012-09-14 08:14:22

标签: c# database entity-framework code-first

我们正在使用没有Edmx文件的Code-first方法,它可以在第一次创建数据库时正常运行。

但是,如果我要添加新数据实体,请将新类称为我的数据库上下文,那么就无法将其添加到该数据库中的新表中。

比如说,最初在数据库中有两个表。 前数据库:DbTest

表:Tbl1,Tbl2

现在,如果我添加新表,比如类名'Tbl3',那么它应该将它添加到现有数据库中。

任何人都可以通过一个例子向我解释如何通过代码优先方法实现它吗?

我见过像Database.SetInitializer(new ........)

这样的内容

我需要在上面的构造函数的空白区域放置什么?

1 个答案:

答案 0 :(得分:1)

如果您查看数据库,您将看到一个名为“EdmMetadata”的表,实体框架使用该表来确定自创建数据库以来是否对您的模型进行了任何更改(在您的情况下它已经存在)。

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

幸运的是,Entity Framework附带了此接口的一些默认实现:

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

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

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

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

在选择初始化策略之前要仔细考虑,因为最终可能会丢失已输入数据库的数据,这可能不是您想要的。

实体框架提供的实现提供了一种Seed方法,用于使用数据加载数据库,这样您就可以在每次创建数据库时使用默认数据预加载数据库。

This文章提供了进一步的信息。

相关问题