2017-02-13 19 views
9

У меня возникли проблемы с добавлением первоначальной миграции в мой контекст базы данных Entity Framework внутри библиотеки классов .NET Core..NET Core Entity Framework - добавление миграции для контекста в библиотеке классов

Когда я бегу:

dotnet ef migrations add migrationName -c PlaceholderContext 

Я получаю сообщение об ошибке:

Could not invoke this command on the startup project 'Placeholder.Data'. This version of the Entity Framework Core .NET Command Line Tools does not support commands on class library projects in ASP.NET Core and .NET Core applications. See http://go.microsoft.com/fwlink/?LinkId=798221 for details and workarounds. 

Так я нажал на link и узнал, что это не возможно добавить миграцию в библиотеку классов. Однако вы можете преобразовать проект библиотеки классов в проект «app», но, делая это, я не могу ссылаться на этот проект «app» из своего бизнес-уровня (библиотеки классов).

структура проекта:

Placeholder.Web (WebAPI) =>Placeholder.Business (библиотека классов) =>Placeholder.Data (библиотека классов)

Project structure

Placeholder.Web => Startup.cs

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddMvc(); 

     //HERE WE REGISTER DB CONTEXT, (STATIC CLASS IN BUSINESS LAYER) 
     services.InjectBusinessContext(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=Placeholder;Integrated Security=True;Connect Timeout=30;"); 

     services.InjectWebServices(); 
     services.InjectBusinessServices(); 
    } 

Как я могу преодолеть эту действительно раздражающую проблему?

Update (1)

Я преобразовал свой класс Placeholder.Data библиотеку к "приложение" с основным методом статического. Потому что я больше не могу ссылаться на Placeholder.Data from Placeholder.Business. Мне нужно обратиться к обходному решению 2, указанному на странице doc microsoft. Когда я теперь запустить сценарий миграции я получаю следующее:

No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext

Doh Ofcourse это не будет работать, то DbContext регистрируется от моего Placeholder.Web приложения (через бизнес-слой). Тогда мой единственный вариант - добавить новый контекст в новый статический основной метод, и я действительно не хочу этого делать.

ответ

6

Вам не нужно «конвертировать» ваш проект данных в приложение. Вот тест приложение с аналогичной структурой:

project structure

В project.json в проекте данных, добавьте основные asp.net пакеты NuGet.

project.json

Теперь, чтобы создать миграцию, кликните правой кнопкой мыши по проекту данных, выберите «Открыть папку в проводнике файлов», то в проводнике файлов, нажмите Shift + щелкните правой кнопкой мыши и «Открыть окно команд здесь. '

Чтобы создать миграцию, просто указать 'запуска проекта' в качестве веб-приложения (где startup.cs существует)

dotnet ef --startup-project ../TestPatterns2.Web migrations add Second 

migrations

И вуаля, миграция:

second migration

ДОБАВИТЬ ПАРАМЕТР МИГРАЦИИ В ПРОЕКТ ДАННЫХ: , когда вы определили servi се, добавить пункт миграции, как так

services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("TestPatterns2.Data"))); 
+0

Я попробую это позже, когда вернусь домой! – Reft

+0

, пожалуйста, отметьте как ответ, если он работает для вас. если вы хотите сделать это еще дальше, вы также можете расширить IServiceCollection в своем проекте библиотеки классов DATA и добавить DI и строки подключения там, чтобы ваш веб-проект полностью не зависел от проекта DATA. – Reza

+0

Извините за поздний ответ, просто попробовал ваш код, и он работает, приветствует. Но! Если вы посмотрите на мою структуру проекта, у меня есть собственная папка с именем migrations. Когда я запускаю команду, я получаю новую папку миграции в моем корне? 1. Могу ли я это изменить? 2. Если я хочу добавить дополнительные миграции после первой первоначальной миграции, нужно ли снова выполнить эти шаги или создать его обычным способом с помощью консоли диспетчера пакетов? – Reft

1

Это должно быть приложение для миграции (требуется точка входа), поэтому после создания библиотеку приложения и создание вашей миграции, закомментируйте элементы buildOptions и runtimes в вашем проекте project.json. Теперь он будет построен как библиотека.

Раскомментируйте их, когда вам нужно добавить другую миграцию.

+0

Я попытался преобразования из «netstandard1.6» в «netcoreapp1.0», но я получаю .data не совместим с netstandard1.6. – Reft

+0

Хорошо, мне пришлось разгрузить Business layer, (reference), а затем он сработал. Я преобразовал библиотеку классов в приложение. Потому что я не могу ссылаться. Данные из. Бизнеса Я вынужден пойти с Обходным решением 2. Кажется, мне нужно зарегистрировать контекст, используя основной метод в .Data? Я не хочу этого делать. – Reft

+0

@Reft Решение, которое я использовал, было объявить вместо него DBFactory. Я не помню сообщение в блоге, которое я нашел, хотя, извините. – BradleyDotNET