实体框架7迁移未创建表

本文关键字:创建 迁移 框架 实体 | 更新日期: 2023-09-27 18:29:19

我正在使用Entity Framework 7进行我的第一个项目,并且正在连接到一个SQL Server,该SQL Server已经创建了数据库,但其中还没有表。我已经创建了DbContext并创建了一个类,然后在上下文中设置了DbSet<>。我运行了启用迁移的命令并创建了第一个迁移,然后用rand命令更新数据库。一切看起来都很好,没有出现任何错误,但当我查看数据库时,只创建了EFMigraitonsHistory表。当我看到为初始迁移创建的类时,它基本上是空白的。我做错了什么?

我正在运行的命令:

dnvm install latest -r coreclr
dnx ef migrations add MyFirstMigration
dnx ef database update

上下文:

namespace JobSight.DAL
{
    public class JobSightDBContext : DbContext
    {
        public DbSet<NavigationMenu> NavigationMenu { get; set; }
    }
}

表类别:

namespace JobSight.DAL
{
    public class NavigationMenu
    {
        [Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int16 ID { get; set; }
        public string ControllerName { get; set; }
        public string ActionName { get; set; }
        public string ExternalURL { get; set; }
        public string Title { get; set; }
        public Int16? ParentID { get; set; }
        public virtual NavigationMenu Parent { get; set; }
    }
}

Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<JobSightDBContext>(options =>
                {
                    options.UseSqlServer(Configuration["Data:JobSightDatabase:ConnectionString"]);
                });
    }

用于初始迁移的类(由EF自动生成):

namespace JobSight.WebUI.Migrations
{
    public partial class Initial : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
        }
        protected override void Down(MigrationBuilder migrationBuilder)
        {
        }
    }
}

编辑:在做了Poke建议的事情之后,这是我新的自动生成的迁移。但是,该表仍然没有在数据库级别创建。

namespace JobSight.WebUI.Migrations
{
    public partial class MyFirstMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "NavigationMenu",
                columns: table => new
                {
                    ID = table.Column<short>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    ActionName = table.Column<string>(nullable: true),
                    ControllerName = table.Column<string>(nullable: true),
                    ExternalURL = table.Column<string>(nullable: true),
                    ParentID = table.Column<short>(nullable: true),
                    Title = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_NavigationMenu", x => x.ID);
                    table.ForeignKey(
                        name: "FK_NavigationMenu_NavigationMenu_ParentID",
                        column: x => x.ParentID,
                        principalTable: "NavigationMenu",
                        principalColumn: "ID",
                        onDelete: ReferentialAction.Restrict);
                });
        }
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable("NavigationMenu");
        }
    }
}

实体框架7迁移未创建表

您需要首先在数据库上下文中设置实体。至少,你需要这样做:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<NavigationMenu>();
}

迁移的问题在项目布局中有点隐藏。因此,您所拥有的是一个包含实体和数据库上下文的JobSight.DAL项目。然后您有一个项目JobSight.WebUI,它是实际的ASP项目,包含带有数据库设置的Startup.cs

这会造成问题,因为默认情况下EF只会假设查找当前程序集中的所有内容。因此,如果您从web项目启动ef命令,即使上下文在另一个项目中,它也会在其中创建迁移。但是,当您尝试应用迁移时,EF不会找到它,因为它只会在上下文的项目中查找。

因此,要解决此问题,您需要在DAL项目中创建迁移。您可以通过在调用ef命令时指定项目来做到这一点:

dnx ef migrations add Example -p JobSight.DAL

您可以通过随后运行dnx ef migrations list来验证这是否有效。现在应该返回Example迁移;以前,该命令没有返回任何内容:它找不到迁移,这就是为什么update命令只说Done(没有应用迁移),并且没有创建数据库的原因。因此,如果您现在在那里进行迁移,那么您可以使用进行应用

dnx ef database update

请注意,由于迁移现在是在DAL项目中创建的,因此需要在那里添加对EntityFramework.MicrosoftSqlServer的引用,否则项目将无法编译。在运行上面的list命令之前,您需要执行此操作。

最后,有关这方面的更多信息,请参阅本期。

虽然这不是原始问题的答案,但我在这里发布我的答案,因为它可能会帮助有类似问题的人。我的问题还在于没有创建表,但dotnet ef migrations add InitialCreate确实在Migrations文件夹中创建了3.cs文件。但dotnet ef database update只创建了MigrationsHistory表,dotnet ef migrations list没有返回任何迁移。

事实证明,问题在于Migrations文件夹已从Visual Studio项目中排除。一旦我再次将其包括在内,一切都很好。

我遇到了同样的问题,就是这样解决的

  1. 我删除了SQL中的数据库
  2. 我更改了上次迁移时使用的名称。我从"添加迁移初始创建"更改为"添加迁移新名称"