2

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

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

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

表:Tbl1,Tbl2

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

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

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

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

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

本文提供了更多信息。

于 2012-09-23T22:20:13.423 回答