Настройка ODP.NET и EF6 в ASP.NET Core с ориентацией на .NET 4.7.2 - PullRequest
0 голосов
/ 12 октября 2018

Я не могу заставить Entity Framework использовать поставщик Oracle (ODP.NET) с моим проектом.

Настройка:

  • ASP.NET Core MVC 2.1 с таргетингом на .NET Framework 4.7.2
  • EntityFramework 6.2
  • ODP.NET 18.3 (Oracle.ManagedDataAccess и Oracle.ManagedDataAccess.EntityFramework)

Хотя я бы предпочел использовать EF Core, я не могу, потому что Oracle пока не поддерживает EF Core, только .NET Core.

Полученные ошибки указывают на то, что приложение пытается использовать драйвер SQL Server.

Я не могу найти пример онлайн для моего сценария.Либо его MVC5 с EF6 / ODP.NET, либо .NET Core примеры с Oracle, которые не имеют EF.

Я предполагаю, что проблема заключается в том, что в MVC5 он настраивается через web.config / app.config.Я предполагаю, что мне нужно настроить Oracle в start.cs, но нужен правильный синтаксис.

То, что я кодировал для класса Context:

public class MainContext : DbContext
    {
        public MainContext(string connectionString) : base(connectionString)
        {
            Database.SetInitializer<MainContext>(null);
        }

        public virtual DbSet<ApplicationSetting> ApplicationSettings { get; set; }
    }

ЗатемЯ создал фабрику:

public class MainContextFactory : IDbContextFactory<MainContext>

{
    private readonly string _connectionString;

    public MainContextFactory(string connectionString)
    {
        _connectionString = connectionString;
    }

    public MainContext Create()
    {
        return new MainContext(_connectionString);
    }
}

В Startup.cs у меня есть:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)

            services.AddTransient<IDbContextFactory<MainContext>>(d =>
                new MainContextFactory(Configuration["ConnectionStrings:Primary"]));

Я вызываю это из своего проекта репозитория (цели .NET 4.7.2) и содержит MainContext:

public class ApplicationSettingRepository : BaseDbRepository, IApplicationSettingRepository
{
    private readonly ILogger<ApplicationSettingRepository> _logger;

    public ApplicationSettingRepository(ILogger<ApplicationSettingRepository> logger, 
                                        IUserContext userContext,
                                        IDbContextFactory<MainContext> dbContextFactory) : base(userContext, dbContextFactory)
    {
        _logger = logger;
    }

    /// <summary>
    /// Get All Application Settings
    /// </summary>
    public async Task<List<IApplicationSetting>> GetAllAsync()
    {
        var list = new List<IApplicationSetting>();

        using (var db = _contextFactory.Create())
        {
            list.AddRange(await db.ApplicationSettings.ToListAsync());
        }

        return list;
    }

, который вызывает базовый класс репозитория:

public abstract class BaseDbRepository : IBaseRepository
{
    protected IDbContextFactory<MainContext> _contextFactory;

    public IUserContext UserContext { get; set; }

    protected BaseDbRepository(IUserContext userContext, IDbContextFactory<MainContext> dbContextFactory)
    {
        UserContext = userContext;
        _contextFactory = dbContextFactory;
    }
}

Вопросы:

  1. Что мне нужно обновить или добавить, чтобы он вызывал ODPПоставщик .NET?
  2. Есть ли лучший подход к конфигурации?

1 Ответ

0 голосов
/ 16 октября 2018

Чтобы связать поставщика Oracle:

Обновите add.config со значениями, которые были в web.config из MVC5:

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
  <entityFramework>
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <oracle.manageddataaccess.client>
    <version number="*">
     <dataSources></dataSources>
    </version>
  </oracle.manageddataaccess.client>
</configuration>

Затем добавьте после services.AddMvc () вstartup.cs:

services.AddScoped(provider =>
            {
                return new OracleDbContext(Configuration["ConnectionString"]);
            });

Кредит Сообщение Тони Снида .

...