没有使用Entity Framework迁移进行初始创建

new*_*_86 26 migration entity-framework

我正在尝试让Entity框架迁移工作.我已启用代码首次迁移,它创建了迁移文件夹,配置文件和迁移历史记录表,但没有初始创建.我错过了一步吗?这是由EF(4.3.1)创建的新数据库.

Ben*_*yne 21

默认情况下,此行为不存在,但您可以轻松地以多种不同的形式使用它.

  1. 您可以context.Database.CreateIfNotExists();在应用程序启动时调用.

  2. 您可以使用其中一个内置DatabaseInitializers.在CreateDatabaseIfNotExists初始化内置的EntityFramework,只是需要将其添加到您的项目.

  3. 您可以创建自己的自定义数据库初始化程序,其中包含选项#1.示例:代码优先迁移和初始化

您可以通过代码或配置文件在项目中包含DatabaseInitializers.

通过代码包含EntityFramework Database Initializer:

在您的应用程序启动中,您可以像这样设置DatabaseInitializer:

System.Data.Entity.Database.SetInitializer<DairyMmmContext>(new System.Data.Entity.CreateDatabaseIfNotExists<DairyMmmContext>());
Run Code Online (Sandbox Code Playgroud)

注意:此代码在entityframework的整个生命周期中已多次更改!此示例适用于EF 4.3,它是通过nuget提供的当前生产版本.

通过配置元素包含EntityFramework Database Initializer:

<configuration>
  <entityFramework>
    <contexts>
      <context type="MyNamespace.MyEFDataContext, AssemblyName">
        <databaseInitializer
          type="System.Data.Entity.CreateDatabaseIfNotExists`2[[MyNamespace.MyEFDataContext, AssemblyName],
               [MyNamespace.Migrations.Configuration,  AssemblyName]], EntityFramework" />
      </context>
    </contexts>
  </entityFramework>
</configuration>
Run Code Online (Sandbox Code Playgroud)

您会注意到这种配置可能有点"不合适".您需要在AssemblyName上面替换您保存实体框架内容的程序集的名称,替换MyNamespace.MyEFDataContext为entityframework数据上下文MyNamespace.Migrations.Configuration的完全限定名称,并将完全限定名称替换为您的配置类(默认情况下,在您的内部的Migration文件夹中)项目).

编辑:编辑回复其他评论

迁移是从一个模式定义到另一个模式定义的更改.创建空数据库不是迁移(但之后的所有内容都是).项目中没有用于创建空数据库的迁移源文件,这是由初始化程序在代码中完成的.

如果您已经在使用DropCreateDatabaseAlways初始化程序,它应该这样做.但是,我注意到你在代码中设置了初始化程序,这意味着存在计时问题的机会(在你的上下文已经超过调用任何初始化程序之后设置初始化程序).

您可以强制entityframework在代码中的任何位置运行初始化程序context.Database.Initialize(true);(参数为true/false以强制初始化,而不管当前状态如何).每次都会丢弃并重新创建数据库.

但您也可以确保在应用程序的生命周期中尽早设置初始化程序(在创建上下文的单个实例之前).


Mos*_*osh 17

"初始创建"不是自动创建的!你需要自己创造.EF的一些教程令人困惑,我和你有同样的误解.

你需要做什么:

-Add-Migration InitialModel
Run Code Online (Sandbox Code Playgroud)

如果您已经创建了数据库表和域模型,那么:

-Add-Migration InitialModel -IgnoreChanges
Run Code Online (Sandbox Code Playgroud)

从这一点开始,您的代码将与数据库同步.无论何时更改代码,都可以使用Add-Migration将更改添加到数据库中.


wow*_*609 9

这里的文章/教程(在microsoft.com上) 描述了initialCreate迁移不存在的原因.只有在数据库已存在的情况下才会添加迁移.否则,第一次迁移将是'initialCreate',因为创建迁移到尚不存在的数据库是没有意义的...没有数据库意味着在向下迁移时没有任何内容可以回滚.

以下是相关段落:

在程序包管理器控制台中运行Enable-Migrations命令此命令已将"迁移"文件夹添加到我们的项目中,此新文件夹包含两个文件:

Configuration类.此类允许您配置迁移对上下文的行为方式.在本演练中,我们将使用默认配置. 由于项目中只有一个Code First上下文,因此Enable-Migrations会自动填充此配置适用的上下文类型.

InitialCreate迁移.生成此迁移是因为在启用迁移之前,我们已经为Code First创建了一个数据库.此scaffolded迁移中的代码表示已在数据库中创建的对象.在我们的例子中,这是具有BlogId和Name列的Blog表.文件名包含一个时间戳,以帮助订购.

如果尚未创建数据库,则不会将此InitialCreate迁移添加到项目中.相反,我们第一次调用Add-Migration时,创建这些表的代码将被搭建到新的迁移中.


jjs*_*ace 5

不确定是否相同,但我遇到了类似的问题。我认为我的问题与我不使用配置文件中的连接字符串来获取连接字符串有关。

摆弄解决方案中的启动项目以及包管理器控制台中的 projet 组合,我能够生成第一个迁移。

还要确保您有一个带有 dbContext 类名称的连接字符串,以便包管理器可以找到它。