Как проверить среду из библиотеки классов, не используя какую-либо форму DI - PullRequest
0 голосов
/ 26 апреля 2019

Мы используем Entity Framework для создания классов из базы данных, поскольку администратор базы данных создает базу данных, и мы не можем сначала использовать код.

При создании леса он создает класс DbContext и заполняет метод onconfiguring строкой соединения, жестко закодированной в этот класс, у нас есть частичный класс, который переопределяет onconfiguring и пытается посмотреть на среду и вернуть другую строку соединения на основе среды , Однако в частичном классе мы не смогли получить доступ к среде, как вы можете с контроллера.

Как проверить текущую среду на уровне DAL, создаваемом командой EF Core scaffold. У нас нет проблем с тем, чтобы сама команда scaffold считывала разные строки подключения, но это должно происходить в самом DAL, поэтому мы можем просто развернуть, чтобы жить, не переназначая заново новую строку подключения.

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="BCrypt.Net-Core" Version="1.6.0" />
    <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.4">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
    <PackageReference Include="Xero.Api.SDK.Core" Version="1.1.3" />
  </ItemGroup>

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

  <ItemGroup>
    <Reference Include="Microsoft.AspNetCore.Hosting">
      <HintPath>..\..\..\Program Files (x86)\dotnet\sdk\NuGetFallbackFolder\microsoft.aspnetcore.hosting\2.2.0\lib\netstandard2.0\Microsoft.AspNetCore.Hosting.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.AspNetCore.Http.Abstractions">
      <HintPath>..\..\..\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.aspnetcore.http.abstractions\2.0.1\lib\netstandard2.0\Microsoft.AspNetCore.Http.Abstractions.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Extensions.Hosting">
      <HintPath>..\..\..\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.extensions.hosting\2.2.0\lib\netstandard2.0\Microsoft.Extensions.Hosting.dll</HintPath>
    </Reference>
  </ItemGroup>

</Project>

1 Ответ

0 голосов
/ 26 апреля 2019

Вам необходимо ввести как DbContextOptions, так и IHostingEnvironment.

Попробуйте выполнить следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using App.Models;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Hosting; // this is required
using System.ComponentModel.DataAnnotations.Schema;



// ...


    public class AppDbContext : IdentityDbContext<IdentityUser>
    {

        public AppDbContext (DbContextOptions<AppDbContext> options,IHostingEnvironment env)
            : base(options)
        {
            this._env = env;
        }

        [NotMapped]
        private IHostingEnvironment _env;

        protected override void OnModelCreating(ModelBuilder builder){
            base.OnModelCreating(builder);
            System.Console.WriteLine("*********************");
            System.Console.WriteLine(this._env.EnvironmentName);
            System.Console.WriteLine("*********************");
        }

        // your entities generated by scaffolding
        public DbSet<App.Models.XModel> XModel { get; set; }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...