2017-08-16 2 views
3

Je suis en train d'utiliser Oracle à l'aide dotConnect pour Oracle (v 9.4). Depuis aspnet noyau 2.0 a le soutien complet de référence plus net framework, je suis en train de se connecter à la base de données à l'aide d'un ensemble régulier .net (par exemple contenant l'ensemble mon DbContext est dans le ciblage .net 4.6.1 et est POSEES dans mon asp.net projet Core 2).aspnetcore 2.0 avec EF6 et dotConnect pour oracle

Je suis face à la question ci-dessous

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

Voici ma CodeConfig classe

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()); 
     } 
} 

Ma classe 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(); 
     }  

    } 
... 
} 

Exception est levée lorsque base(nameOrConnectionString) est exécuté.

DI au démarrage

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;" 
    } 
    } 

Les liens suivants sont utilisés comme référence.

  1. Getting started Asp.net core with EF6

  2. aspnet core 1.x with EF6 (Basé sur 1.x, mais a des informations utiles)

Répondre

1

Après plusieurs essais, j'ai finalement été en mesure de se fissurer par cela.

  1. quot; dans la chaîne de connexion doit être remplacé par «
  2. Au lieu de cibler netcoreapp2.0, cibler votre application aspnetcore 2.0 net461 ou tout autre cadre complet supérieur à celui (Cherchez net461 dans votre aspnetcore 2.0 fichier csproj)
  3. Ajouter EF> = 6.1 de nuget à votre assemblage modal/entités. Référence Devart.Data, DevArt.Data.Oracle. Devart.Data.Oracle.Entoty.EF6 dans le même assemblage.
  4. Créer une OracleDbConfiguration de classe dérivée de DevArt.Data.Entity.OracleEntityProviderServicesConfiguration
public class OracleDbConfiguration : OracleEntityProviderServicesConfiguration// : DbConfiguration 
{ 
    public OracleDbConfiguration() 
    { 
     SetProviderServices("Devart.Data.Oracle", OracleEntityProviderServices.Instance); 
     SetProviderFactory("Devart.Data.Oracle", OracleProviderFactory.Instance); 
    } 
} 
  1. décorez votre classe DbContext avec elle. Par exemple.

    [DbConfigurationType(typeof(OracleDbConfiguration))]

  2. Créer un constructeur statique sur votre classe DbContext et le remplir comme celui-ci

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

Quand je reçois une chance, je vais télécharger une application simple qui a la solution complète.