2017-08-16 25 views
3

我想使用Oracle使用dotConnect for Oracle(v 9.4)。由于aspnet核心2.0完全支持引用旧的.net框架,我试图连接到数据库使用常规的.net程序集(即程序集包含我的DbContext在目标。NET 4.6.1,并已在我的聊天室网站核心2项目)。aspnetcore 2.0与EF6和dotConnect为oracle

我对着跌破发行

"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=&quot;User Id=UID;Password=****;Server=Server;Persist Security Info=True&quot;" 
    } 
    } 

以下链接被用作参考。

  1. Getting started Asp.net core with EF6

  2. aspnet core 1.x with EF6(基于1.x的,但有一些有用的信息)

回答

1

多次尝试后,我终于能够通过此破解。

  1. “在连接字符串应与“
  2. 而是瞄准netcoreapp2.0的,针对你aspnetcore 2.0的应用程序net461或任何完整的框架高于(在你的aspnetcore 2.0的csproj文件查找net461)
  3. 加入EF> =取代6.1从nuget到你的模态/实体组件。参考文献Devart.Data,DevArt.Data.OracleDevart.Data.Oracle.Entoty.EF6在同一个程序集中。
  4. DevArt.Data.Entity.OracleEntityProviderServicesConfiguration
public class OracleDbConfiguration : OracleEntityProviderServicesConfiguration// : DbConfiguration 
{ 
    public OracleDbConfiguration() 
    { 
     SetProviderServices("Devart.Data.Oracle", OracleEntityProviderServices.Instance); 
     SetProviderFactory("Devart.Data.Oracle", OracleProviderFactory.Instance); 
    } 
} 
创建派生的类OracleDbConfiguration
  • 装饰你的DbContext类与它。例如。

    [DbConfigurationType(typeof(OracleDbConfiguration))]

  • 您的DbContext类创建一个静态构造函数,并填写像这样

  • static MyEntities() 
    { 
        var config = Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance; 
        config.CodeFirstOptions.ColumnTypeCasingConventionCompatibility = false; 
    } 
    

    当我得到一个机会,我会上传一个简单的应用程序,它有完整的解决方案。