Я не могу заставить 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;
}
}
Вопросы:
- Что мне нужно обновить или добавить, чтобы он вызывал ODPПоставщик .NET?
- Есть ли лучший подход к конфигурации?