如何使用DevArt EDML文件建立Oracle连接并解决相关运行报错
解决方案步骤
1. 修正项目配置文件
首先确保你的控制台项目的App.config包含以下正确配置,指定EF使用Devart Oracle提供程序,避免默认使用SqlClient导致关键字不识别:
<configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <providers> <provider invariantName="Devart.Data.Oracle" type="Devart.Data.Oracle.Entity.OracleEntityProviderServices, Devart.Data.Oracle.Entity.EF6" /> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="Devart.Data.Oracle" /> <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle" /> </DbProviderFactories> </system.data> </configuration>
如果要直接在配置里写连接字符串,额外添加以下节点即可直接调用无参构造函数new KiddataAdminEntities()使用:
<connectionStrings> <add name="KiddataAdminEntitiesConnectionString" connectionString="User Id=xxxx;Password=xxxx;Server=xx;Direct=True;Sid=xxxx;Persist Security Info=True" providerName="Devart.Data.Oracle" /> </connectionStrings>
2. 手动传入现有Oracle连接的修正方案
你之前触发UnintentionalCodeFirstException的原因是重载的构造函数没有触发EDML预设的Database First模型加载逻辑,EF误以为你要使用Code First模式创建模型,命中了生成代码里的防护抛出异常,按以下步骤修正即可:
- 首先在程序入口处注册Devart的EF配置:
DbConfiguration.SetConfiguration(new Devart.Data.Oracle.Entity.OracleEntityProviderServicesConfiguration());
- 不要修改EDML自动生成的上下文文件,在同项目下新建同名partial类扩展构造函数:
public partial class KiddataAdminEntities : DbContext { public KiddataAdminEntities(DbConnection existingConnection, bool contextOwnsConnection) : base(existingConnection, contextOwnsConnection) { // 调用自动生成的配置方法 Configure(); // 强制关闭Code First模型初始化,避免触发OnModelCreating Database.SetInitializer<KiddataAdminEntities>(null); } }
- 调用时传入你已经测试可用的OracleConnection实例即可:
OracleConnection oc = new OracleConnection("你的连接字符串"); oc.Open(); using(var context = new KiddataAdminEntities(oc, contextOwnsConnection: true)) { var listOfAnrede = context.Anrede.ToList(); }
3. 额外验证项
- 确保安装的Devart Oracle组件版本和EF6版本匹配,必须使用对应EF6的Devart驱动包
- 确保EDML生成的模型程序集和控制台项目引用的Devart组件版本完全一致,避免版本冲突
内容的提问来源于stack exchange,提问作者PassionateDeveloper
相关产品推荐
相关产品推荐

