Подтвердить что ты не робот

Является ли EF Core Add Migration поддержкой стандартной библиотеки .NET?

Мы пытались запустить EF Core Migration в библиотеке классов .Net Standard 1.6, но она терпит неудачу. Но то же самое происходит в библиотеке классов .Net Core 1.1.

Поддерживается ли EF-миграция в .NET STANDARD?

4b9b3361

Ответ 1

Документация охватывает этот случай как знать проблему/ограничение, когда DbContext помещается внутри библиотеки классов netstandardx.y.

Обходной путь 1 - использовать приложение в качестве проекта запуска

Если у вас есть существующее приложение .NET Core или приложение .NET Framework (включая базовое веб-приложение ASP.NET), вы можете использовать его как проект запуска. Если нет, вы можете создать новый, только для использования с .NET Command Line Tools. Укажите проект запуска, который является "исполняемым приложением". Пример: консоль

dotnet ef migrations list --startup-project ../MyConsoleApp/

Обходной путь 2 - Перекрестная настройка рамок, выполняемых с помощью

Добавьте дополнительную целевую структуру в проект библиотеки классов. Это может быть версия .NET Core App или .NET Framework. Чтобы сделать проект .NET Core App, добавьте "netcoreapp1.0" для проекта, как в примере ниже: XML

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp1.0;netstandard1.4</TargetFrameworks>
  </PropertyGroup>
</Project>

При таргетинге на .NET Framework убедитесь, что вы нацелены на реализацию проектов версии 4.5.1 или новее. XML

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net46;netstandard1.4</TargetFrameworks>
  </PropertyGroup>
</Project>

Ответ 2

Для пользователей EF Core Package Manager Console Tools, которые видят следующие ошибки:

Проект запуска "MyNetStandardLibrary" ориентирован на фреймворк ".NETStandard". С этой платформой не связано время выполнения, и проекты, нацеленные на нее, не могут быть выполнены напрямую. Чтобы использовать инструменты консоли диспетчера пакетов Entity Framework Core с этим проектом, добавьте исполняемый проект, ориентированный на .NET Framework или .NET Core, который ссылается на этот проект, и установите его в качестве запускаемого проекта; или обновите этот проект для перекрестной нацеливания .NET Framework или .NET Core.

ИЛИ

Ваш целевой проект "MyNetCoreApp" не соответствует вашей сборке миграции "MyNetStandardLibrary". Измените целевой проект или измените сборку миграции.


документация раскрывает причину этих ошибок:

Целевой проект - это место, где любые файлы добавляются (или в некоторых случаях удаляются). По умолчанию для целевого проекта выбран проект по умолчанию, выбранный в консоли диспетчера пакетов, но его также можно указать с помощью параметра -Project.

При запуске кода проекта запускается проект запуска. По умолчанию используется один набор как проект запуска в обозревателе решений. Его также можно указать с помощью параметра -StartupProject.

В двух словах, вам нужно настроить проект StartUp на проект, имеющий среду выполнения .NET (в данном случае -.NET Core), а затем убедитесь, что вы установили свой проект .NET Standard в качестве консоли диспетчера пакетов> Проект по умолчанию.

Пример решения CLI:

Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp

Решение без CLI:

  1. Щелкните правой кнопкой мыши приложение .NET Core в своем проекте
  2. Нажатие "Установить как стартовый проект"
  3. Откройте консоль диспетчера пакетов
  4. Выберите свой проект .NET Standard из раскрывающегося списка "Проект по умолчанию" в консоли диспетчера пакетов
  5. Запустите команду CLI (Add-Migration, добавление dotnet ef migrations и т.д.)

Ответ 3

Я не пробовал с .Net Standard 1.6, но он работает для 2.0.

Microsoft.EntityFrameworkCore.Tools.DotNet необходимо добавить в каждую из ваших библиотек классов, в которых есть DbContext. Щелкните правой кнопкой мыши проект и выберите Edit *.csproj. Затем добавьте следующее:

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview2-final" />
  </ItemGroup>

Здесь вы можете увидеть более углубленное руководство: EF 7 Миграции с несколькими DBContexts

Ответ 4

@Tseng, спасибо! Вот явные инструкции.

Изменить файл проекта:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>
</Project>

Затем добавьте дизайн фабрики:

 public class DesignTimeActivitiesDbContextFactory : IDesignTimeDbContextFactory<ActivitiesDbContext>
    {
        public ActivitiesDbContext CreateDbContext(string[] args)
        {
            DbContextOptionsBuilder<ActivitiesDbContext> builder = new DbContextOptionsBuilder<ActivitiesDbContext>();

            var context = new ActivitiesDbContext(
                builder
                .UseSqlServer("Data Source=(local);Initial Catalog=Activities;Integrated Security=False;User ID=user;Password=pw;Connect Timeout=30;Encrypt=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;")
                .Options);

            return context;
        }
    }

Тогда построй.

Затем откройте командную строку, перейдите в папку с проектами и запустите:

dotnet ef migrations add InitialCreate

Теперь должна быть автоматически сгенерированная папка миграции. Любить это!

Ответ 5

позорно для Microsoft.

я перенес свой dbcontext в консольное приложение в своем решении ядра dotnet.

В моем решении 5 проектов.

тогда я бегу dotnet ef migrations add CreateDatabase

я использую против кода и dotnet cli.