一次Oracle 11g+FluentNHibernate AutoMapping組合嘗試
本文的上下文環(huán)境
操作系統(tǒng):Win7 x64 Ultimate
開發(fā)工具:Visual Studio 2013
一、前言
在以前開發(fā)的大多數(shù)場(chǎng)景下,使用的開發(fā)語(yǔ)言是C#,使用的數(shù)據(jù)庫(kù)是Sql Server,這樣的組合,必然少不了Entity Framework這樣的ORM,自從習(xí)慣了Entity Framework,就甩不掉了。這次因?yàn)橐恍v史原因,數(shù)據(jù)庫(kù)必須用Oracle,其實(shí),我不太喜歡Oracle,這樣的數(shù)據(jù)庫(kù)給我的印象是使用起來(lái),無(wú)論是安裝客戶端,配置連接,都太費(fèi)勁了。?
有些事情,你還真得硬著頭皮去嘗試,你不去做,永遠(yuǎn)都不會(huì)明白。因?yàn)槲抑暗捻?xiàng)目Entity Framewor +Sql Server是比較常用的,所以對(duì)Entity Framework這樣的ORM已經(jīng)很熟悉了,Entity Framework的DataBase First和Model First,使用的時(shí)候,總會(huì)遇到一些問(wèn)題,比如表字段的維護(hù),只能通過(guò)設(shè)計(jì)器,更新,如果表很多的話,設(shè)計(jì)器顯示很慢,更新還經(jīng)常出錯(cuò),所以我一直都是用Code First。這次既然是Oracle,我以為很簡(jiǎn)單,換個(gè)引用或連接串就行了(如果以后東西真的這樣就好了)。
?
二、ODP.Net安裝
首先搜索一番,知道有個(gè)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。這個(gè)ODP.Net其實(shí)和微軟的System.Data.OracleClient一樣,都是提供對(duì)Oracle數(shù)據(jù)庫(kù)訪問(wèn)的驅(qū)動(dòng),不過(guò)ODP.Net是Oracle自己開發(fā)的,可能有些人會(huì)以為,項(xiàng)目中換下引用就行了,其實(shí)一開始我也這么認(rèn)為,之后查了些資料才明白,System.Data.OracleClient用的是Oracle的“最小驅(qū)動(dòng)”,使用的時(shí)候應(yīng)該是不需要安裝Oracle客戶端的,本人沒有實(shí)踐過(guò),使用過(guò)的朋友可以幫忙證明下。之后看了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 .這個(gè)我看到最重要的是System.Data.OracleClient已deprecated,在將來(lái)的 .Net Framework里就看不到了。所以,現(xiàn)在最好是用ODP.Net。
首先要下載ODP.Net,這個(gè)要和Oracle服務(wù)器端的版本相對(duì)應(yīng),我用的是Oracle 11g,所以下載了ODAC1120320Xcopy_32bit,我的操作系統(tǒng)是x64的,可以下載32位和64位的,一開始下載了64位的,但是在IIS 7.5里運(yùn)行網(wǎng)站的時(shí)候,提示” 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設(shè)為True,就能正常運(yùn)行了,64位下如果Enable 32-Bit Applications設(shè)為False估計(jì)也行,對(duì)于ODP.Net的安裝, 這里 面有詳細(xì)的介紹,正確安裝相當(dāng)重要。
Oracle的這部分完成了,下面就是ORM的選擇了,解壓ODP.Net后,在odp.net4\odp.net\doc里看到一個(gè)readme.htm,打開仔細(xì)閱讀,看到這條“ODP.NET 11.2.0.3 does not support Code First nor the DbContext APIs.“瞬間就被震住了。之后在Oracle Community看到社區(qū)管理員的回答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的反應(yīng)真夠慢的。所以,只能放棄Entity Framework了,聽朋友推薦說(shuō)可以用Fluent NHibernate。
?
三、Fluent NHibernate配置
所以決定try,在VS2013里引用FluentNHibernate,Install-Package FluentNHibernate -Version 1.4.0,目前是最新版。接下來(lái)就是基礎(chǔ)搭建了。
由于在繼承ClassMap的那種方式下,一個(gè)數(shù)據(jù)庫(kù)表會(huì)寫2個(gè)實(shí)體,感覺太麻煩了,我這里用的是AutoMapping,實(shí)體和數(shù)據(jù)庫(kù)表一一對(duì)應(yīng),沒有考慮多表關(guān)聯(lián)問(wèn)題。
首先是個(gè)DBContext:

接下來(lái)是一張和數(shù)據(jù)庫(kù)表Product相對(duì)應(yīng)的實(shí)體:

接下來(lái)是映射關(guān)系:

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

?
四、測(cè)試

??ps:由于是事后之作,沒有來(lái)得及整理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
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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