Не удается найти класс DbContext, используя do tnet, если при миграции добавить Initial -s <project>- c -о - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь узнать, как генерировать миграции, используя do tnet core Entity Framework.

У меня есть ASP. NET Core Web API-проект, который ссылается на два проекта, каждый из которых содержит DBContext. .

Мне успешно удалось сгенерировать миграции для одного dbcontext, используя:

dotnet ef migrations add Initial -s <startup_project> -c <fully qualified class name from referenced project> -o <output dir>

Однако для второго DbContext не удается найти DbContext с сообщением: No DbContext named 'dcs3spp.courseManagementContainers.BuildingBlocks.IntegrationEventLogEF.IntegrationEventLogContext' was found.

Файл проекта для указанного проекта имеет путь, на который правильно ссылается содержимое:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <ProjectReference Include="..\EventBus\EventBus.csproj" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.1">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.1" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.1.2" />
  </ItemGroup>

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
  </PropertyGroup>

</Project>

Файл проекта для ASP. NET проекта запуска Core Web API:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <ProjectReference Include="..\Courses.Domain\Courses.Domain.csproj" />
    <ProjectReference Include="..\Courses.Infrastructure\Courses.Infrastructure.csproj" />
    <ProjectReference Include="..\..\..\BuildingBlocks\EventBus\EventBus\EventBus.csproj" />
    <ProjectReference Include="..\..\..\BuildingBlocks\EventBus\IntegrationEventLogEF\IntegrationEventLogEF.csproj" />
    <ProjectReference Include="..\..\..\BuildingBlocks\WebHost.Customization\WebHost.Customization.csproj" />
    <ProjectReference Include="..\..\..\BuildingBlocks\EventBus\EventBusRabbitMQ\EventBusRabbitMQ.csproj" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="AspNetCore.HealthChecks.AzureServiceBus" Version="3.0.0" />
    <PackageReference Include="AspNetCore.HealthChecks.Npgsql" Version="3.0.0" />
    <PackageReference Include="AspNetCore.HealthChecks.Rabbitmq" Version="3.0.5" />
    <PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="3.0.2" />
    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
    <PackageReference Include="Dapper" Version="2.0.30" />
    <PackageReference Include="MediatR" Version="8.0.0" />
    <PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="8.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.1">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Npgsql" Version="4.1.3" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.1.2" />
    <PackageReference Include="Polly" Version="7.2.0" />
    <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
    <PackageReference Include="Serilog.Enrichers.Environment" Version="2.1.3" />
    <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
    <PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
    <PackageReference Include="Serilog.Sinks.Http" Version="5.2.0" />
    <PackageReference Include="Serilog.Sinks.Seq" Version="4.0.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0" />
    <PackageReference Include="System.Reflection" Version="4.3.0" />
  </ItemGroup>

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>


</Project>

Исходный код для класса контекста, который не может быть найден:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace dcs3spp.courseManagementContainers.BuildingBlocks.IntegrationEventLogEF
{
    public class IntegrationEventLogContext : DbContext
    {       
        public IntegrationEventLogContext(DbContextOptions<IntegrationEventLogContext> options) : base(options)
        {
        }

        public DbSet<IntegrationEventLogEntry> IntegrationEventLogs { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {          
            builder.Entity<IntegrationEventLogEntry>(ConfigureIntegrationEventLogEntry);
        }

        void ConfigureIntegrationEventLogEntry(EntityTypeBuilder<IntegrationEventLogEntry> builder)
        {
            builder.ToTable("IntegrationEventLog");

            builder.HasKey(e => e.EventId);

            builder.Property(e => e.EventId)
                .IsRequired();

            builder.Property(e => e.Content)
                .IsRequired();

            builder.Property(e => e.CreationTime)
                .IsRequired();

            builder.Property(e => e.State)
                .IsRequired();

            builder.Property(e => e.TimesSent)
                .IsRequired();

            builder.Property(e => e.EventTypeName)
                .IsRequired();
        }
    }
}

Startup.cs проекта ASP. NET Core Web API добавляет контексты БД: следующим образом:

services.AddEntityFrameworkNpgsql()
                   .AddDbContext<CourseContext>(options =>
                   {
                       options.UseNpgsql(configuration["ConnectionString"],
                           npgsqlOptionsAction: sqlOptions =>
                           {
                               sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
                               sqlOptions.EnableRetryOnFailure(maxRetryCount: 15, maxRetryDelay: TimeSpan.FromSeconds(30), errorCodesToAdd: null);
                           });
                   },
                       ServiceLifetime.Scoped  //Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request)
                   );

            services.AddDbContext<IntegrationEventLogContext>(options =>
            {
                options.UseNpgsql(configuration["ConnectionString"],
                                     npgsqlOptionsAction: sqlOptions =>
                                     {
                                         sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
                                         //Configuring Connection Resiliency: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency 
                                         sqlOptions.EnableRetryOnFailure(maxRetryCount: 15, maxRetryDelay: TimeSpan.FromSeconds(30), errorCodesToAdd: null);
                                     });
            });

Можно ли сгенерировать миграции для многих подклассов DbContext из стартового проекта?

Если да, каковы потенциальные причины невозможности найти DBCont Ext Class?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Решено путем реализации экземпляра IDesignTimeDbContextFactory . Нашел это решение после прочтения this

Теперь, когда я запускаю ...

dotnet ef migrations add Initial -s <startup_project> -c <fully.qualified.context.class.name> -o <output dir>

EntityFrameworkCore находит мой второй класс контекста.

0 голосов
/ 19 февраля 2020

Проблема в том, что вы пытаетесь создать базу данных с первым кодом из двух разных DbContext, которые указывают на одну базу данных - это может сделать только один контекст.

Я бы предложил вам создать один общий DbContext, который отвечает только за создание базы данных. Затем вы можете создать свои реальные контексты приложения, которые содержат подмножества из большого.

Возможно ли создать миграции для многих подклассов DbContext из стартового проекта?

Возможно генерировать миграции для многих подклассов DbContext, если они указывают на разные базы данных.

Каковы возможные причины невозможности найти DBContext class?

Из обнаруженной вами ошибки я вижу, что вы ищете пространство имен, а не текущий класс DbContext.

'dcs3spp.courseManagementContainers.BuildingBlocks .IntegrationEventLogEF 'должен быть' dcs3spp.courseManagementContainers.BuildingBlocks.IntegrationEventLogEF.IntegrationEventLogContext '

...