2016-07-22 2 views
4

Я пытаюсь использовать Entity Framework Core в репозитории данных, но у меня возникают проблемы с созданием базы данных EF.Entity Framework Основные инструменты при создании репозитория

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

Теперь, как мне представляется, в документации по использованию EF Migrations. Инструкции по установке зависимостей и инструменты:

  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

и бежать dotnet ef migrations add MigrationName вместе с dotnet ef database update.

Теперь вот что происходит. Когда я создаю репозиторий, у меня есть проект AppName.Data, где реализованы хранилища, и проект AppName.WebApi, где хранятся хранилища.

Если я попытаюсь добавить инструменты и запустить dotnet ef от AppName.Data, это не сработает, потому что AppName.Data - это библиотека. В сообщении об ошибке говорится, что этот инструмент можно использовать только в контексте одного исполняемого приложения.

Следующая попытка состояла в том, чтобы запустить dotnet ef из AppName.WebApi, который является исполняемым. Теперь dotnet ef работает, но если я попробую dotnet ef migrations add InitialMigration создать базу данных, я получаю одну ошибку, потому что DbContext не находится на проекте AppName.WebApi, но на другом проекте.

Я действительно не знаю, как это сделать. Поэтому, если я хочу, чтобы EF создавал базу данных и все это, и я хочу использовать репозитории, так что есть нет конкретного кода EF в исполняемом проекте, что мне делать?

+0

В консоли диспетчера пакетов укажите проект, в котором находится applicationdbcontext, а затем запустите его. – Thennarasan

ответ

1

После поиска об этом, я нашел на the docs в разделе «Предварительный просмотр 2 известных проблем», что в настоящее время является ограничением инструментов. Для выполнения этого проекта требуется один исполняемый проект приложения, поскольку он должен использовать dotnet run.

Документы также предлагают обходные пути. Тот, который я предпочитал и который работал для меня, был первым решением. Мы просто указываем на один исполняемый проект приложения, передающий --startup-project с путём проекта.

Так вместо того, чтобы работать

dotnet ef migrations add MigrationName 

Бежим

dotnet ef --startup-project pathToProject migrations add MigrationName 

и все работает, как ожидалось.

0

Кроме того, в вашем хранилище можно добавить следующий код в класс DbContext:

public InviteesDbContext(bool recreate = false) 
    { 
     if (recreate) 
     { 
      recreateDatabase(this); 
     } 
    } 

    private static void recreateDatabase(InviteesDbContext dbContext) 
    { 
     dbContext.Database.EnsureDeleted(); 
     dbContext.Database.EnsureCreated(); 

     setPermissions(dbContext); 
     seed(dbContext); 
    } 

Чтобы активировать этот код и повторно (создать) свою базу данных по желанию, в проекте консоли добавляют к раствору, что этот проект использует ваш проект datarepository.

static void Main() 
    { 
     using (InviteesDbContext dbContext = new InviteesDbContext(false)) 
     { 
      Console.WriteLine("Database in existence or created"); 
      Invitee invitee = dbContext.Invitees.Where(i => i.Id == 1).SingleOrDefault(); 
      if (invitee != null) 
      { 
       Console.WriteLine("Invitee " + invitee.Id.ToString() + " found !!"); 
      } 
      Console.ReadKey(); 
     } 

    } 

Если вы временно изменение

using (InviteesDbContext dbContext = new InviteesDbContext(true)) 

и запустить консольное приложение базы данных будет повторно (создано).

Предупреждение: Используйте этот код только на более ранних этапах вашего проекта, когда база данных меняется регулярно, и потенциальная потеря данных не так важна. Никогда не используйте этот код в процессе производства.