2017-08-16 1 views
3

Ich versuche Oracle mit dotConnect für Oracle (v 9.4) zu verwenden. Da aspnet core 2.0 volle Unterstützung für das Referenzieren des älteren .net-Frameworks bietet, versuche ich, eine Verbindung zur Datenbank mit einer regulären .net-Assembly herzustellen (dh Assembly mit meinem DbContext ist in Targeting .net 4.6.1 und wurde in meinem asp.net verwiesen Kern 2-Projekt).aspnetcore 2.0 mit EF6 und dotConnect für Oracle

ich die unten stehende Frage bin vor

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

Hier ist meine CodeConfig Klasse

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

Meine DbContext Klasse

[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 wird ausgelöst, wenn base(nameOrConnectionString) wird ausgeführt.

DI in Start

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

Die folgenden Verbindungen werden als Referenz verwendet.

  1. Getting started Asp.net core with EF6

  2. aspnet core 1.x with EF6 (auf 1.x Basierend aber hat nützliche Informationen)

Antwort

1

Nach vielen Versuchen war ich endlich in der Lage, dies zu knacken durch.

  1. quot; in Verbindung sollten Zeichenfolge mit '
  2. Statt netcoreapp2.0 Targeting ersetzt werden, Ihre aspnetcore 2.0-Anwendung zu net461 Ziel oder ein vollständiger Rahmen höher als die (Suchen Sie nach net461 in Ihrer aspnetcore 2.0 csproj Datei)
  3. hinzufügen EF> = 6.1 von nugget zu Ihrer Modal/Entities-Assembly. Referenz Devart.Data, DevArt.Data.Oracle. Devart.Data.Oracle.Entoty.EF6 in der gleichen Baugruppe.
  4. eine Klasse OracleDbConfiguration Abgeleitet Erstellen von DevArt.Data.Entity.OracleEntityProviderServicesConfiguration
public class OracleDbConfiguration : OracleEntityProviderServicesConfiguration// : DbConfiguration 
{ 
    public OracleDbConfiguration() 
    { 
     SetProviderServices("Devart.Data.Oracle", OracleEntityProviderServices.Instance); 
     SetProviderFactory("Devart.Data.Oracle", OracleProviderFactory.Instance); 
    } 
} 
  1. Ihre DbContext Klasse Verzieren mit ihm. Z.B.

    [DbConfigurationType(typeof(OracleDbConfiguration))]

  2. Erstellen Sie einen statischen Konstruktor auf DbContext Klasse und füllen es wie dieses

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

Wenn ich eine Chance bekomme, werde ich eine einfache App laden die hat die komplette Lösung.

Verwandte Themen