我目前正在开发一个具有本地SQL数据库的MVC4应用程序,但还需要连接到Oracle数据库以获取一些东西......
现在,我有MVC和EF的经验,但我对Oracle缺乏了解。
经过漫长的早上搜索和试用,错误和帮助我设法使用“常规”方式连接到oracle数据库,打开新的OracleConnection(connString)并使用OracleCOmmand执行SQL。所以我知道我的connectionstring是正确的,数据库是可访问的。
我希望我可以创建一个DataContext类,并使用我的工作连接字符串,当我这么做时,EF可以开箱即用
using (var ctx = new OracleContext())
{
var test = ctx.People.ToList();
}
但是,现在我收到一条关于从“get_ProviderFactory”返回的null的错误。是否需要一些额外的步骤才能让EF工作?
如果您需要任何额外信息,我很乐意提供这些信息!
提前致谢!
答案 0 :(得分:2)
是的,我想出了这个...所以这是我解决这个问题的方式以供将来参考......
首先,为了测试数据提供程序出了什么问题,我在应用程序的开头某处使用了这段代码:
DataTable dataTable = DbProviderFactory.GetFactoryClasses();
这给了我一个DataTable来检查。在Rows-property中它显示了5个不同的Dataproviders(OleDB,SQL等),我的5号是我安装的Oracle Dataprovider。这告诉我,我安装了正确的提供程序(只是因为它在那里),但它是Oracle.ManagedDataAccess.Client,而不是Oracle.DataAccess.Client ...所有SO帖子和互联网从未告诉我关于这个管理的......
因此,通过添加Oracle.ManagedDataAccess dll,将copylocal设置为false并将其引用到应用程序(在GAC中我也可以猜测)并更改了connectionstring中的connectionsName属性,使其成为一个简单的修复。 web.config到
providerName="Oracle.ManagedDataAccess.Client"
如果您没有在dataTable中安装OracleProvider但是您确定已安装它,则可能没有将其添加到您的machine.config中。您可以将其添加到web.config root:
<system.data>
<DbProviderFactories>
<add name="ODP.NET Managed Driver"
invariant="Oracle.ManagedDataAccess.Client"
description="Oracle Data Provider for .NET, Managed Driver"
type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess,
Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
(猜测也可以用它来在没有Provider dll的机器上部署它,只要你将Dll与应用程序一起部署)
希望这有助于未来的访客!