Миграция Entity Framework 7 не создает таблицы

Я работаю с моим первым проектом, используя Entity Framework 7, и подключаюсь к 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; }
    }
}

Автозагрузка.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");
        }
    }
}

2 ответов


сначала необходимо настроить объект в контексте базы данных. По крайней мере, вам нужно будет сделать это:

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

    modelBuilder.Entity<NavigationMenu>();
}

проблема с вашими миграциями была немного скрыта в вашем макете проекта. Так что у вас есть JobSight.DAL проект, содержащий сущности и контекст базы данных. И тогда у вас есть проект JobSight.WebUI который является фактическим проектом ASP, содержащим Startup.cs С настройки базы данных.

это вызывает проблемы, потому что по умолчанию EF просто предполагает найти все в текущей сборке. Поэтому, если вы запускаете ef команда из вашего веб-проекта, она создаст миграции там, даже если контекст находится в другом проекте. Но когда вы пытаетесь применить миграцию, EF не найдет ее, так как она будет выглядеть только в проекте контекста.

поэтому, чтобы исправить это, вам нужно создать миграции в . Это можно сделать, указав проект при вызове :

dnx ef migrations add Example -p JobSight.DAL

вы можете проверить, что это сработало, запустив dnx ef migrations list далее. Теперь это должно вернуть Example миграция; ранее эта команда ничего не возвращала: она не могла найти миграцию, которая является причиной того, что update команда только сказала Done (без учета миграции) и база данных не была создана. Поэтому, если вы теперь получите миграцию, вы можете применить ее, используя:

dnx ef database update

обратите внимание, что с момента миграции теперь создается в проекте DAL, необходимо добавить ссылку на EntityFramework.MicrosoftSqlServer там, в противном случае проект не будет компилироваться. Вам нужно сделать это, прежде чем вы сможете запустить выше.

наконец, для получения дополнительной информации об этом см. этот вопрос.


хотя это не ответ на исходный вопрос, я отвечу здесь, потому что это может помочь кому-то, кто имеет похожие проблемы. Моя проблема заключалась также в том, что таблицы не были созданы, но dotnet ef migrations add InitialCreate создать 3 .cs файлы в миграция папка. Но!--1--> только создал таблицу MigrationsHistory и dotnet ef migrations list не возвращал никаких миграций.

оказалось, что проблема в том, что миграция папка была исключена из проект Visual Studio. Как только я включил его снова, все работало нормально.