Entity framework 针对.NET 4.7.2的ASP.NET核心上的ODP.NET和EF6配置
我无法让Entity Framework在我的项目中使用Oracle提供程序(ODP.NET) 设置: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 我收到
- ASP.NET核心MVC 2.1针对.NET Framework 4.7.2
- EntityFramework 6.2
- ODP.NET 18.3(Oracle.ManagedDataAccess和Oracle.ManagedDataAccess.EntityFramework)
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;
}
}
问题:
要关联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"]);
});