我正在将 Web 应用程序移植到 Entity Framework 4.5。我的主要目标是同时支持 MSSQL 和 Oracle 数据库,并能够以编程方式(在 Global.asax 中)告诉 ORM 以哪个数据源为目标。SQL 和 Oracle 模式在功能上显然是相同的;这是我们已经在生产中使用的一种方法,以及我们想要丢弃的另一个 ORM。
注意:我们正在测试它的机器有 Windows 8 Release Preview Build 8400 64 位、Visual Studio Professional 2012 RC 11.0.50706.0 和 .NET framework 4.5.50501。它不是标准的开发机器(其他有 XP 和 7 w/Visual Studio 2010 和 .NET 4),而是我们用来测试这些新技术的新机器。我不知道这些新技术是否有问题,还没有在“标准”开发机器上测试过。
精简版
我将在下面详细解释情况,但主要问题是:
- 在“添加新的 ADO.NET 实体数据模型”向导中,我看不到我安装的 ODP.NET 数据提供程序(见下文),因此我无法从 Oracle 数据库创建模型。为什么?此外,在“关于 Visual Studio”弹出窗口中,我没有看到列出的适用于 Visual Studio 的 Oracle 开发人员工具。我担心 Oracle 开发人员工具无法正常工作,但 Oracle 通用安装程序说一切都已正确安装(我重新启动了几次)。
- 实现此要求的最佳实践是什么?
长版
首先,我们从 SQL Server 数据库创建实体数据模型。到目前为止,一切都很好。
然后,我们从http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html安装了 ODAC 11.2 Release 4 和 Oracle Developer Tools for Visual Studio (11.2.0.3.0)
我已经成功地初始化了我们的模型,SIAEntities
(它继承自 ObjectContext
),使用:
System.Data.EntityClient.EntityConnectionStringBuilder builder = new System.Data.EntityClient.EntityConnectionStringBuilder();
builder.Metadata = "res://*/SIA.Models.SIAModelOracle.ssdl|res://*/Models.SIAModel.csdl|res://*/Models.SIAModel.msl";
builder.ProviderConnectionString = "data source=***;persist security info=True;user id=***;password=***";
builder.Provider = "Oracle.DataAccess.Client";
SIAEntities db2 = new SIAEntities(builder.ConnectionString);
其中SIA.Models.SIAModelOracle.ssdl
是一个自定义写入文件(嵌入式资源),它覆盖了 .edmx 的 SSDL 部分并具有以下修改:
Provider
根节点的属性Schema
设置为Oracle.DataAccess.Client
- 所有数据类型名称都转换为它们的 Oracle 等效名称(datetime > date、nvarchar > varchar2、image > blob 等)
- 在 which 中添加的
oracle.dataaccess.client
节点web.config
映射bool
到number(1,0)
和tinyint
到number(3,0)
执行第一个查询时出现错误(一个简单的SELECT
):我将其跟踪为由于对数据库执行的查询中的双引号引起的,迫使它区分大小写。
通过手动编辑自定义 .ssdl 文件并将所有内容大写,我可以让 EF “看到”表格并识别一列接一列,但我没有将这个解决方案推得太远(因此在阅读整个表格之前停止),因为a) 它看起来不太干净 b) 我很难理解 .ssdl 和 .csdl/.msl 部分之间的链接,所以我不知道在哪里大写,在哪里不大写!
我正在考虑避免这种手动工作的另一个策略可能是尝试从 Oracle 模式生成一个单独的模型,并将这两个ObjectContext
s 与另一个处理它们之间的选择的类包装起来,但正如问题 #2 所说,我做不到那。