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

Я работаю со своим первым проектом, используя Entity Framework 7, и подключаюсь к SQL Server, где база данных уже создана, но в ней еще нет таблиц. Я создал свой DbContext и создал класс, а затем установил DbSet<> внутри своего контекста. Я выполнил команды, чтобы включить миграцию и создать первую миграцию, а затем выполнить команду для обновления базы данных. Все работало нормально, ошибок не возникало, но когда я смотрю на базу данных, создается только таблица 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");
        }
    }
}

person Matthew Verstraete    schedule 07.01.2016    source источник


Ответы (3)


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

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

    modelBuilder.Entity<NavigationMenu>();
}

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

Это вызывает проблемы, потому что по умолчанию EF просто предполагает найти все в текущей сборке. Поэтому, если вы запускаете команду 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 выше.

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

person poke    schedule 07.01.2016
comment
Я добавил код переопределения в свой контекст, и теперь в классе миграции есть код для создания таблицы, но при запуске команды обновления моя таблица все еще не создается. Я обновил исходный пост командами, которые я запускаю для этого. - person Matthew Verstraete; 07.01.2016
comment
Возвращает ли ef database update какие-либо выходные данные? Вы уверены, что смотрите в правильную базу данных? Проверьте строку подключения, чтобы убедиться, с чем вы работаете. - person poke; 07.01.2016
comment
Я уверен, что это правильная БД. Я могу удалить таблицу EFMigrationHistory, и она будет воссоздана, плюс это единственная БД на сервере. Когда я запускаю команду dnx ef database update, все, что она делает, это сидит там, а затем говорит done. Должен ли я делать что-то особенное, поскольку БД уже существовала, просто не имея таблиц? - person Matthew Verstraete; 07.01.2016
comment
Вы создали новую миграцию, и эта миграция имеет вызов CreateTable в части Up, верно? - person poke; 07.01.2016
comment
Для меня был сгенерирован новый класс миграции, и он содержит команду CreateTable. Я опубликую новый в ОП через мгновение - person Matthew Verstraete; 07.01.2016
comment
Можете ли вы попробовать очистить всю базу данных, удалить папку Migrations из вашего проекта, а затем заново создать и применить миграцию? - person poke; 07.01.2016
comment
Только что попробовал. На этот раз вызвал миграцию Test1. Я вижу, что создан класс миграции Test1, и таблица истории добавлена ​​​​в БД, но не в таблицу NavigationMenu. - person Matthew Verstraete; 07.01.2016
comment
Есть ли способ поделиться всем вашим проектом, чтобы я мог взглянуть на него? - person poke; 07.01.2016
comment
Конечно, куда бы вы хотели, чтобы я его выбросил? - person Matthew Verstraete; 07.01.2016
comment
Может быть, на GitHub или залить куда-нибудь zip? - person poke; 07.01.2016
comment
хорошо, дайте мне несколько минут, чтобы выяснить, где опубликовать его. Сейчас у вас нет настроек для обмена файлами. - person Matthew Verstraete; 07.01.2016
comment
это должно сделать это за вас drive.google.com/file/ d/0BxA-roBz9DmBdzU5SXZ6dUdnV1E/ - person Matthew Verstraete; 07.01.2016
comment
Обновил мой ответ решением :) - person poke; 07.01.2016
comment
Спасибо за помощь. Сейчас это работает. Следует отметить, что в моем DbContext мне не нужна строка modelBuilder.Entity<NavigationMenu>();. - person Matthew Verstraete; 07.01.2016

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

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

person Tobias    schedule 04.08.2017

У меня была такая же проблема, и я решил ее так

  1. Я удалил свою базу данных в SQL
  2. Я изменил имя, которое использовал для предыдущей миграции. Я изменил «Add-Migration InitialCreate» на «Add-Migration NewName».
person Yusuf Anyanzwa    schedule 10.10.2019