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

以下链接仅供参考。

    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.DataDevArt.Data.OracleDevart.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项目模板

LINQ 和 EF6:创建模型时无法使用上下文

EF6异常:DbExpressionBinding需要一个带有ResultType集合的输入表达式

带有 EF 6 的 MySql 连接器

带有 EF6 的 WPF 应用程序不会在 SQL Server Enterprise 中创建新数据库

带有 dnx 项目的 EF 6