Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 针对.NET 4.7.2的ASP.NET核心上的ODP.NET和EF6配置_Entity Framework_Asp.net Core_Odp.net - Fatal编程技术网

Entity framework 针对.NET 4.7.2的ASP.NET核心上的ODP.NET和EF6配置

Entity framework 针对.NET 4.7.2的ASP.NET核心上的ODP.NET和EF6配置,entity-framework,asp.net-core,odp.net,Entity Framework,Asp.net Core,Odp.net,我无法让Entity Framework在我的项目中使用Oracle提供程序(ODP.NET) 设置: ASP.NET核心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 我收到

我无法让Entity Framework在我的项目中使用Oracle提供程序(ODP.NET)

设置:

  • ASP.NET核心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,或者带有Oracle的.NET核心示例没有EF

我的假设是,问题在于MVC5通过web.config/app.config配置它。我假设我需要在start.cs中配置Oracle,但需要正确的语法。

我为上下文类编写的代码:

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

        public virtual DbSet<ApplicationSetting> ApplicationSettings { get; set; }
    }
public类MainContext:DbContext
{
公共主上下文(字符串连接字符串):基本(连接字符串)
{
Database.SetInitializer(null);
}
公共虚拟数据库集应用程序设置{get;set;}
}
然后我创建了一个工厂:

public class MainContextFactory : IDbContextFactory<MainContext>

{
    private readonly string _connectionString;

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

    public MainContext Create()
    {
        return new MainContext(_connectionString);
    }
}
公共类MainContextFactory:IDbContextFactory
{
私有只读字符串_connectionString;
公共MainContextFactory(字符串连接字符串)
{
_connectionString=connectionString;
}
公共MainContext Create()
{
返回新的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"]));
public void配置服务(IServiceCollection服务)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
services.AddTransient(d=>
新的MainContextFactory(配置[“ConnectionString:Primary”]);
我从我的存储库项目(targets.NET 4.7.2)中调用它,并包含main上下文:

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;
    }
公共类应用程序设置存储库:BaseDbRepository,iaapplicationsettingrepository
{
专用只读ILogger\u记录器;
公共应用程序设置存储库(ILogger logger,
IUserContext用户上下文,
IDbContextFactory dbContextFactory):基础(userContext,dbContextFactory)
{
_记录器=记录器;
}
/// 
///获取所有应用程序设置
/// 
公共异步任务GetAllAsync()
{
var list=新列表();
使用(var db=_contextFactory.Create())
{
AddRange(等待db.ApplicationSettings.toListSync());
}
退货清单;
}
它调用一个基本存储库类:

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;
    }
}
public抽象类BaseDbRepository:IBaseRepository
{
受保护的IDbContextFactory\u contextFactory;
公共IUserContext用户上下文{get;set;}
受保护的BaseDbRepository(IUserContext userContext,IDbContextFactory dbContextFactory)
{
UserContext=UserContext;
_contextFactory=dbContextFactory;
}
}
问题:

  • 我需要更新或添加什么才能调用ODP.NET提供程序
  • 有更好的配置方法吗

  • 要关联Oracle提供程序,请执行以下操作:

    使用MVC5中web.config中的值更新add.config:

    <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>
    

    归功于。

    我不认为您可以将ASP.NET Core与EF6混合使用。在Oracle ODP.NET支持EF Core之前,您可能只能使用ASP.NET 4.x/EF 6。您可以,更多信息,请访问:
    services.AddScoped(provider =>
                {
                    return new OracleDbContext(Configuration["ConnectionString"]);
                });