如何在没有配置文件的情况下使用Oracle Entity Framework

时间:2015-09-06 22:57:28

标签: oracle entity-framework entity-framework-6 odp.net

是否可以创建一个代码优先的Entity Framework模型,该模型使用ODP.Net连接到现有数据库而无需在app.config文件中进行任何设置?

我尝试过很多不同的事情。

目前我正在设置DbConfiguration:

    sealed class EntityFrameworkConfiguration : DbConfiguration
    {
        public static readonly DbConfiguration Instance = new EntityFrameworkConfiguration();

        EntityFrameworkConfiguration()
        {
            this.SetDefaultConnectionFactory(new OracleConnectionFactory());
            this.SetProviderServices("Oracle.ManagedDataAccess.Client", EFOracleProviderServices.Instance);
        }
    }

    DbConfiguration.SetConfiguration(EntityFrameworkConfiguration.Instance);

我将OracleConnection直接传递给EF上下文。

但是,我要么在SQL Server格式中生成SQL(使用表别名的双引号),要么出现以下错误:

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.dll

Additional information: Unable to determine the provider name for provider factory of type 'Oracle.ManagedDataAccess.Client.OracleClientFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.

有没有人在没有使用crud污染app.config的情况下获得此功能的经验?

2 个答案:

答案 0 :(得分:4)

是。要完成从machine.config / app.config到基于代码的配置的切换,我还必须包含对SetProviderFactory()的调用。

public sealed class EntityFrameworkConfiguration : DbConfiguration
{
    public static readonly DbConfiguration Instance = new EntityFrameworkConfiguration();

    public EntityFrameworkConfiguration()
    {
        SetDefaultConnectionFactory(new OracleConnectionFactory());
        SetProviderServices("Oracle.ManagedDataAccess.Client", EFOracleProviderServices.Instance);
        SetProviderFactory("Oracle.ManagedDataAccess.Client", new OracleClientFactory());
    }
}

我在应用程序启动时也调用DbConfiguration.SetConfiguration(EntityFrameworkConfiguration.Instance);因为我在多个程序集中都有DbContext,所有程序集都需要共享此配置。

另外,我还发现,如果您可能无法修复用户的machine.config,则允许您的应用程序在ConfigurationErrorsException: The 'DbProviderFactories' section can only appear once per config file周围工作。

答案 1 :(得分:1)

UFF。发现了问题。

因为我使用小写注册列映射,所以查询不起作用。列名和表名必须为大写。

多么愚蠢。