2016-01-07 8 views
7

Я работаю с моим первым проектом с использованием Entity Framework 7 и подключаюсь к SQL Server, где база данных уже создана, но в ней пока нет таблиц. Я создал свой DbContext и создал класс, а затем установил DbSet<> в моем контексте. Я выполнил команды для включения миграции и создания первой миграции, а затем rand команду для обновления базы данных. Все выглядело нормально, никаких ошибок не возникало, но когда я смотрю на базу данных, была создана только таблица EFMigraitonsHistory. Когда я смотрю на класс, который был создан для первоначальной миграции, он по сути пуст. Что я делаю не так?Entity Framework 7 миграция не создает таблицы

Команды Я бегу:

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) 
     { 
     } 
    } 
} 

Edit: После делать то, что предложил 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"); 
     } 
    } 
} 

ответ

14

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

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 выше.

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

+0

Я добавил код переопределения в свой контекст, и теперь у класса миграции есть код для его создания, но при запуске команды обновления он все равно не строит мою таблицу. Я обновил исходное сообщение с помощью команд, которые я запускаю для этого. – Matthew

+0

Результирует ли обновление базы данных ef? Вы уверены, что ищете правильную базу данных? Проверьте строку подключения, чтобы убедиться, с чем вы работаете. – poke

+0

Я уверен, что это правильный БД. Я могу удалить таблицу EFMigrationHistory, и она будет воссоздана, плюс это единственная БД на сервере. Когда я запускаю команду dnx ef database update, все, что она делает, сидит там, а затем говорит «done». Должен ли я делать что-то особенное, поскольку БД уже существовала, просто не имея таблиц? – Matthew

1

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

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

Смежные вопросы