ASP.NET Core 2.0与EF6和dotConnect for Oracle

3

我正在尝试使用dotConnect for Oracle(v9.4)连接Oracle数据库。由于aspnet core 2.0已经完全支持引用旧的.NET框架,因此我正在尝试使用常规的.NET程序集(即包含我的DbContext的程序集以.NET 4.6.1为目标,并在我的asp.net core 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;"
    }
  }

以下链接供参考。
  1. 使用 EF6 开始 Asp.net core

  2. aspnet core 1.x 中的 EF6(基于 1.x,但包含有用信息)

1个回答

2

经过多次尝试,我终于成功攻克了这个问题。

  1. 应将连接字符串中的“quot;”替换为“'
  2. 将你的aspnetcore 2.0应用程序目标定向到net461或任何高于此的完整框架(在你的aspnetcore 2.0 csproj文件中查找net461)
  3. 从nuget添加EF >=6.1到你的modal/entities组件。引用Devart.DataDevArt.Data.Oracle和与之相同组件中的Devart.Data.Oracle.Entoty.EF6
  4. 创建一个继承自DevArt.Data.Entity.OracleEntityProviderServicesConfiguration的OracleDbConfiguration类
public class OracleDbConfiguration : OracleEntityProviderServicesConfiguration// : DbConfiguration
{
    public OracleDbConfiguration()
    {
         SetProviderServices("Devart.Data.Oracle", OracleEntityProviderServices.Instance);
         SetProviderFactory("Devart.Data.Oracle", OracleProviderFactory.Instance);
    }
}
  1. 在您的DbContext类上使用它进行装饰。例如:

    [DbConfigurationType(typeof(OracleDbConfiguration))]

  2. 在您的DbContext类上创建一个静态构造函数,并按照以下方式填写:

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

我有机会的话,将上传一个简单的应用程序,其中包含完整的解决方案。


1
这正是我所需要的。我没必要使用 Devart,但在连接字符串中使用 ' 而不是 ",并将我的 .Net Core MVC 应用程序定位到 net461,似乎已经解决了问题。谢谢!!! - neilsimp1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接