【问题标题】:Code first database migration代码优先数据库迁移
【发布时间】:2012-09-14 08:14:21
【问题描述】:

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

但是,如果我向数据库上下文中添加新数据实体说新类,则它无法将其添加到该数据库中的新表中。

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

表:Tbl1,Tbl2

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

谁能用一个例子向我解释一下如何通过代码优先的方法来实现它?

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

上面构造函数的空白区域需要填什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    This 文章提供了更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多