带有 EF6 和 dotConnect for oracle 的 aspnetcore 2.0
Posted
技术标签:
【中文标题】带有 EF6 和 dotConnect for oracle 的 aspnetcore 2.0【英文标题】:aspnetcore 2.0 with EF6 and dotConnect for oracle 【发布时间】:2018-01-24 20:59:19 【问题描述】:我正在尝试使用 dotConnect for Oracle(v 9.4) 来使用 Oracle。由于 aspnet core 2.0 完全支持引用较旧的 .net 框架,我正在尝试使用常规 .net 程序集连接到数据库(即包含我的 DbContext 的程序集以 .net 4.6.1 为目标,并在我的 asp.net 中被引用核心 2 项目)。
我面临以下问题
"System.TypeInitializationException: 'The type initializer for 'System.Data.Entity.Internal.AppConfig' threw an exception.'
Inner Exception: FileNotFoundException: Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified."
这是我的CodeConfig
课程
public class CodeConfig : DbConfiguration
public CodeConfig()
SetProviderServices("Devart.Data.Oracle", Devart.Data.Oracle.Entity.OracleEntityProviderServices.Instance);
SetProviderFactory("Devart.Data.Oracle", new Devart.Data.Oracle.OracleProviderFactory());
我的 DbContext 类
[DbConfigurationType(typeof(CodeConfig))]
public partial class MyEntities : DataContext, IMyStoredProcedures
public MyEntities(string nameOrConnectionString) : base(nameOrConnectionString)
Configure();
private void Configure()
this.Configuration.AutoDetectChangesEnabled = true;
this.Configuration.LazyLoadingEnabled = true;
this.Configuration.ProxyCreationEnabled = true;
this.Configuration.ValidateOnSaveEnabled = true;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
throw new UnintentionalCodeFirstException();
...
执行
base(nameOrConnectionString)
时抛出异常。
DI 在启动中
var dbContext = new MyEntities(Configuration["Data:DefaultConnection:ConnectionString"]);
services.AddScoped<IDataContextAsync>(provider => dbContext);
services.AddScoped<IMyStoredProcedures>(provider => dbContext);
Appsettings.json
"Data":
"DefaultConnection":
"ConnectionString": "metadata=res://Org.MyApp.Entities/MyModel.csdl|res://Org.MyApp.Entities/MyModel.ssdl|res://Org.MyApp.Entities/MyModel.msl;provider=Devart.Data.Oracle;provider connection string="User Id=UID;Password=****;Server=Server;Persist Security Info=True""
以下链接仅供参考。
Getting started Asp.net core with EF6
aspnet core 1.x with EF6(基于1.x但有有用信息)
【问题讨论】:
【参考方案1】:经过多次尝试,我终于可以破解了。
-
quot;连接字符串应替换为 '
不要以 netcoreapp2.0 为目标,而是将您的 aspnetcore 2.0 应用程序定位为 net461 或任何高于此的完整框架(在您的 aspnetcore 2.0 csproj 文件中查找 net461)
将 EF >=6.1 从 nuget 添加到您的模态/实体程序集。参考
Devart.Data
,DevArt.Data.Oracle
。 Devart.Data.Oracle.Entoty.EF6
在同一个程序集中。
创建一个派生自DevArt.Data.Entity.OracleEntityProviderServicesConfiguration
的类OracleDbConfiguration
public class OracleDbConfiguration : OracleEntityProviderServicesConfiguration// : DbConfiguration public OracleDbConfiguration() SetProviderServices("Devart.Data.Oracle", OracleEntityProviderServices.Instance); SetProviderFactory("Devart.Data.Oracle", OracleProviderFactory.Instance);
用它装饰你的 DbContext 类。例如
[DbConfigurationType(typeof(OracleDbConfiguration))]
在您的 DbContext 类上创建一个静态构造函数并像这样填充它
static MyEntities() var config = Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance; config.CodeFirstOptions.ColumnTypeCasingConventionCompatibility = false;
如果有机会,我会上传一个简单的应用程序,它有完整的解决方案。
【讨论】:
这正是我所需要的。我不需要做任何涉及 Devart 的事情,但是在连接字符串中使用'
而不是 "
并在我的 .Net Core MVC 应用程序中定位 net461
似乎已经成功了。谢谢!!!以上是关于带有 EF6 和 dotConnect for oracle 的 aspnetcore 2.0的主要内容,如果未能解决你的问题,请参考以下文章
dotConnect for Oracle v9.1发布,新增SSDT-BI项目模板
EF6异常:DbExpressionBinding需要一个带有ResultType集合的输入表达式