一次Oracle 11g+FluentNHibernate AutoMapping組合嘗試
本文的上下文環境
操作系統:Win7 x64 Ultimate
開發工具:Visual Studio 2013
一、前言
在以前開發的大多數場景下,使用的開發語言是C#,使用的數據庫是Sql Server,這樣的組合,必然少不了Entity Framework這樣的ORM,自從習慣了Entity Framework,就甩不掉了。這次因為一些歷史原因,數據庫必須用Oracle,其實,我不太喜歡Oracle,這樣的數據庫給我的印象是使用起來,無論是安裝客戶端,配置連接,都太費勁了。?
有些事情,你還真得硬著頭皮去嘗試,你不去做,永遠都不會明白。因為我之前的項目Entity Framewor +Sql Server是比較常用的,所以對Entity Framework這樣的ORM已經很熟悉了,Entity Framework的DataBase First和Model First,使用的時候,總會遇到一些問題,比如表字段的維護,只能通過設計器,更新,如果表很多的話,設計器顯示很慢,更新還經常出錯,所以我一直都是用Code First。這次既然是Oracle,我以為很簡單,換個引用或連接串就行了(如果以后東西真的這樣就好了)。
?
二、ODP.Net安裝
首先搜索一番,知道有個ODP.Net,官方介紹:Oracle Data Provider for .NET (ODP.NET) features optimized ADO.NET data access to the Oracle database. ODP.NET allows developers to take advantage of advanced Oracle database functionality, including Real Application Clusters, XML DB, and advanced security. The data provider can be used with the latest .NET Framework 4.5.1 version。這個ODP.Net其實和微軟的System.Data.OracleClient一樣,都是提供對Oracle數據庫訪問的驅動,不過ODP.Net是Oracle自己開發的,可能有些人會以為,項目中換下引用就行了,其實一開始我也這么認為,之后查了些資料才明白,System.Data.OracleClient用的是Oracle的“最小驅動”,使用的時候應該是不需要安裝Oracle客戶端的,本人沒有實踐過,使用過的朋友可以幫忙證明下。之后看了System.Data.OracleClient Namespace的介紹:The System.Data.OracleClient namespace is the .NET Framework Data Provider for Oracle.This types in System.Data.OracleClient are deprecated and will be removed in a future version of the .NET Framework. For more information, see? Oracle and ADO.NET .這個我看到最重要的是System.Data.OracleClient已deprecated,在將來的 .Net Framework里就看不到了。所以,現在最好是用ODP.Net。
首先要下載ODP.Net,這個要和Oracle服務器端的版本相對應,我用的是Oracle 11g,所以下載了ODAC1120320Xcopy_32bit,我的操作系統是x64的,可以下載32位和64位的,一開始下載了64位的,但是在IIS 7.5里運行網站的時候,提示” Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format." ,所以我下載了32位的,如果IIS 7.5里的Advanced Setting下Enable 32-Bit Applications設為True,就能正常運行了,64位下如果Enable 32-Bit Applications設為False估計也行,對于ODP.Net的安裝, 這里 面有詳細的介紹,正確安裝相當重要。
Oracle的這部分完成了,下面就是ORM的選擇了,解壓ODP.Net后,在odp.net4\odp.net\doc里看到一個readme.htm,打開仔細閱讀,看到這條“ODP.NET 11.2.0.3 does not support Code First nor the DbContext APIs.“瞬間就被震住了。之后在Oracle Community看到社區管理員的回答ODP.NET does not support EF Code First yet. For the next ODP.NET release (ODAC 12c Release 3), Oracle plans to support this feature. The plan is to release sometime in 2014.我只感到這大Oracle的反應真夠慢的。所以,只能放棄Entity Framework了,聽朋友推薦說可以用Fluent NHibernate。
?
三、Fluent NHibernate配置
所以決定try,在VS2013里引用FluentNHibernate,Install-Package FluentNHibernate -Version 1.4.0,目前是最新版。接下來就是基礎搭建了。
由于在繼承ClassMap的那種方式下,一個數據庫表會寫2個實體,感覺太麻煩了,我這里用的是AutoMapping,實體和數據庫表一一對應,沒有考慮多表關聯問題。
首先是個DBContext:

接下來是一張和數據庫表Product相對應的實體:

接下來是映射關系:

指定主鍵的生成方式:(這里用的是自己手動賦值,就是在保存的時候,調用DBContext里的GenerateID()方法)

?
四、測試

??ps:由于是事后之作,沒有來得及整理demo,沒有完整代碼下載,Hope it can help you.
?
引用閱讀:
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html
http://dba.stackexchange.com/questions/44470/why-oracle-sql-developer-does-not-need-oracle-client
http://msdn.microsoft.com/en-us/library/system.data.oracleclient(v=vs.110).aspx
?
http://www.thebestcsharpprogrammerintheworld.com/blogs/connect-to-an-oracle-database-without-an-oracle-client.aspx
http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
