C# 实体框架7迁移不创建表

C# 实体框架7迁移不创建表,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我正在使用EntityFramework7处理我的第一个项目,并且正在连接到一个SQL Server,其中已经创建了数据库,但其中还没有表。我已经创建了我的DbContext并创建了一个类,然后在我的上下文中设置了一个DbSet。我运行命令来启用迁移并创建第一次迁移,然后运行命令来更新数据库。看起来一切正常,没有出现错误,但当我查看数据库时,只创建了efmigrationshistory表。当我查看为初始迁移创建的类时,它基本上是空白的。我做错了什么 我正在运行的命令: dnvm install

我正在使用EntityFramework7处理我的第一个项目,并且正在连接到一个SQL Server,其中已经创建了数据库,但其中还没有表。我已经创建了我的
DbContext
并创建了一个类,然后在我的上下文中设置了一个
DbSet
。我运行命令来启用迁移并创建第一次迁移,然后运行命令来更新数据库。看起来一切正常,没有出现错误,但当我查看数据库时,只创建了
efmigrationshistory
表。当我查看为初始迁移创建的类时,它基本上是空白的。我做错了什么

我正在运行的命令:

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; }
    }
}
Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<JobSightDBContext>(options =>
                {
                    options.UseSqlServer(Configuration["Data:JobSightDatabase:ConnectionString"]);
                });
    }
编辑: 按照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");
        }
    }
}
namespace JobSight.WebUI.Migrations
{
公共部分类MyFirstMigration:迁移
{
受保护的覆盖作废(MigrationBuilder MigrationBuilder)
{
migrationBuilder.CreateTable(
名称:“导航菜单”,
列:表=>new
{
ID=table.Column(可空:false)
.Annotation(“SqlServer:ValueGenerationStrategy”,SqlServerValueGenerationStrategy.IdentityColumn),
ActionName=table.Column(可空:true),
ControllerName=table.Column(可空:true),
ExternalURL=table.Column(可空:true),
ParentID=table.Column(可空:true),
Title=table.Column(可空:true)
},
约束:表=>
{
表.PrimaryKey(“PK_导航菜单”,x=>x.ID);
表1.外键(
名称:“FK_NavigationMenu_NavigationMenu_ParentID”,
列:x=>x.ParentID,
原则:“导航菜单”,
主栏:“ID”,
onDelete:referentialiction.Restrict);
});
}
受保护的覆盖无效关闭(MigrationBuilder MigrationBuilder)
{
DropTable(“导航菜单”);
}
}
}

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

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<NavigationMenu>();
}
您可以在之后运行
dnx ef migrations list
来验证这是否有效。现在应该返回
示例
迁移;以前,该命令没有返回任何内容:它找不到迁移,这就是为什么
update
命令只说
Done
(没有应用迁移)而没有创建数据库的原因。因此,如果您现在在那里进行迁移,则可以使用以下方法应用它:

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


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

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


事实证明,问题在于Migrations文件夹被排除在Visual Studio项目之外。一旦我再次包含它,一切正常。

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

  • 我用SQL删除了我的数据库
  • 我更改了上次迁移时使用的名称。我将“添加迁移初始创建”更改为“添加迁移新名称”

  • 我将覆盖代码添加到我的上下文中,现在迁移类中确实有生成表的代码,但在运行update命令时,它仍然没有生成表。我已经用我正在运行的命令更新了原始帖子。ef数据库更新是否返回任何输出?您确定正在查看正确的数据库吗?检查您的连接字符串以确保您使用的是什么。我确信它是正确的DB。我可以删除EFMigrationHistory表并重新创建它,而且它是服务器上唯一的数据库。当我运行
    dnx ef database update
    命令时,它所做的只是坐在那里,然后说
    done
    。由于DB已经存在,只是没有任何表,我需要做一些特殊的事情吗?您确实创建了一个新的迁移,并且该迁移在
    Up
    部分中有一个CreateTable调用,对吗?为我生成了一个新的迁移类,它确实包含
    CreateTable
    命令。我马上会在OP上发布新的
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.Entity<NavigationMenu>();
    }
    
    dnx ef migrations add Example -p JobSight.DAL
    
    dnx ef database update