Entity Framework With Oracle

雖然EF6都快要出來了,但是對于Oracle數據庫,仍然只能用DB first和Model First來編程,不能用Code First真是一個很大的遺憾啊。

好了,廢話少說,我們來看看EF中是如何用DB first和Model First來對Oracle編程的。

首先我們要下載ODP.NET這個數據驅動程序,下載鏈接:http://www.oracle.com/technetwork/topics/dotnet/index-085163.html

安裝成功后,我們在VS連接Oracle數據庫時就可以選擇ODP.NET了,如圖:

Model First

模型優先是先建立數據模型,然后再根據模型生成相應的數據庫腳本,然后再根據腳本生成數據庫。

在項目中新增一個ADO.NET實體模型:OracleModel.edmx,選擇“空模型”,再新新建兩個實體:Destination與Lodging,如圖:

為了看清這兩個模型中屬性的數據類型,我把他們生成的類也貼出來一下:

View Code
 public partial class Destination{public Destination(){this.Lodging = new HashSet<Lodging>();}public int DestinationId { get; set; }public string Name { get; set; }public string Country { get; set; }public byte Photo { get; set; }public string Description { get; set; }public virtual ICollection<Lodging> Lodging { get; set; }}public partial class Lodging{public int LodgingId { get; set; }public string Name { get; set; }public string Owner { get; set; }public bool IsResort { get; set; }public decimal MilesFromNearestAirport { get; set; }public int DestinationDestinationId { get; set; }public virtual Destination Destination { get; set; }}

實體模型的空白處,右鍵-屬性,在打開的OracleModel模型屬性窗口,設置一些屬性,將DDL生成模板改成:SSDLToOracle.tt (VS),數據庫架構名稱改成:GYOUNG(這是我自己測試的Oracle數據庫的用戶名,大家可根據自己的更改),數據庫生成工作流改成:Generate Oracle Via T4 (TPT).xaml (VS)

為了讓EF更好的明白.NET中的數據類型與Oracle中數據類型間的對應關系。我們可以將下面的配置文件加到app.config中。

  <oracle.dataaccess.client><settings><add name="bool" value="edmmapping number(1,0)" /><add name="byte" value="edmmapping number(3,0)" /><add name="int16" value="edmmapping number(4,0)" /><add name="int32" value="edmmapping number(9,0)" /><add name="int64" value="edmmapping number(18,0)" /></settings></oracle.dataaccess.client>

現在我們就可以生成數據庫的相應腳本了。

在空白處右鍵,選擇“根據模型生成數據庫”

然后建立好數據連接,如圖:

點擊下一步,然后就會生成相應的數據腳本。

View Code
-- Creating table 'Destinations'
CREATE TABLE "GYOUNG"."Destinations" ("DestinationId" NUMBER(9,0) NOT NULL,"Name" NCLOB NOT NULL,"Country" NCLOB NOT NULL,"Photo" NUMBER(3,0) NOT NULL,"Description" NCLOB NOT NULL
);-- Creating table 'Lodgings'
CREATE TABLE "GYOUNG"."Lodgings" ("LodgingId" NUMBER(9,0) NOT NULL,"Name" NCLOB NOT NULL,"Owner" NCLOB NOT NULL,"IsResort" NUMBER(1,0) NOT NULL,"MilesFromNearestAirport" NUMBER(38,0) NOT NULL,"DestinationDestinationId" NUMBER(9,0) NOT NULL
);-- --------------------------------------------------
-- Creating all PRIMARY KEY constraints
-- ---------------------------------------------------- Creating primary key on "DestinationId"in table 'Destinations'
ALTER TABLE "GYOUNG"."Destinations"
ADD CONSTRAINT "PK_Destinations"PRIMARY KEY ("DestinationId" )ENABLEVALIDATE;-- Creating primary key on "LodgingId"in table 'Lodgings'
ALTER TABLE "GYOUNG"."Lodgings"
ADD CONSTRAINT "PK_Lodgings"PRIMARY KEY ("LodgingId" )ENABLEVALIDATE;-- --------------------------------------------------
-- Creating all FOREIGN KEY constraints
-- ---------------------------------------------------- Creating foreign key on "DestinationDestinationId" in table 'Lodgings'
ALTER TABLE "GYOUNG"."Lodgings"
ADD CONSTRAINT "FK_DestinationLodging"FOREIGN KEY ("DestinationDestinationId")REFERENCES "GYOUNG"."Destinations"("DestinationId")ENABLEVALIDATE;-- Creating index for FOREIGN KEY 'FK_DestinationLodging'
CREATE INDEX "IX_FK_DestinationLodging"
ON "GYOUNG"."Lodgings"("DestinationDestinationId");-- --------------------------------------------------
-- Script has ended
-- --------------------------------------------------

我們只要將腳本到數據庫中執行一下就可以生成相應的表了。分析一下生成的SQL語句,有主鍵,外鍵,但并沒有為主鍵設置自增長。Oracle設置自增長也是一個很蛋疼的問題,要通過設置相應的Sequences和Triggers來實現,習慣了SQL SERVER的IDENTITY,對于這個還真不爽。這里我們不管它,就自己插入主鍵好了。下面是測試代碼:

View Code
 using (OracleModelContainer context = new OracleModelContainer()){var destination = new Destination{DestinationId=1,Country = "Indonesia",Description = "EcoTourism at its best in exquisite Bali",Name = "Bali"};var lodging = new Lodging{LodgingId=1,Owner="Jshon",Name = "Top Notch Resort and Spa",MilesFromNearestAirport = 30,IsResort=true,Destination=destination};context.Lodgings.Add(lodging);context.SaveChanges();}

通過VS連接Oracle可以看到數據插入成功。

DB First

DB First顧名思義就是在先建好數據庫,再進行編程。我們新建一個項目,就以剛剛生成的那再張表來編程。

在新建項目中添加一個“ADO.NET 實體數據模型”:DBModel.edmx,選擇“從數據庫生成”

設置好連接串

選擇表

點擊完成,就會生成相應的模型。

我們來檢索一下剛剛插入的數據。

View Code
 using (Entities context = new Entities()){var des = context.Destinations.FirstOrDefault();var log = context.Lodgings.FirstOrDefault();Console.WriteLine("Lodging  Name:" + log.Name + " Owner:" + log.Owner);Console.WriteLine("Destination   Name:" + des.Name + " Country:" + des.Country);}

結果如圖。

PS:在DB First模式中,更要將Model First中所說的映射配置文件加入App.config中,不然很多數據類型映射會出錯。

?

偽Code First

見我的另一篇博客:Entity Framework Code First在Oracle下的偽實現

?

轉載于:https://www.cnblogs.com/Gyoung/archive/2013/02/04/2881747.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260036.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260036.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260036.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(三)Maven倉庫介紹與本地倉庫配置

1.Maven本地倉庫/遠程倉庫的基本介紹 示意圖&#xff1a; 本地倉庫是指存在于我們本機的倉庫&#xff0c;在我們加入依賴時候&#xff0c;首先會跑到我們的本地倉庫去找&#xff0c;如果找不到則會跑到遠程倉庫中去找。對于依賴的包大家可以從這個地址進行搜索&#xff1a;http…

大數據時代下的遷移學習_繼深度學習后,下一個熱點技術是遷移學習

最早提出大數據時代到來的是知名咨詢公司麥肯錫&#xff0c;麥肯錫稱&#xff1a;“數據&#xff0c;已經滲透到當今每一個行業和業務職能領域&#xff0c;成為重要的生產因素。人們對于海量數據的挖掘和運用&#xff0c;預示著新一波生產率增長和消費者盈余浪潮的到來。”其實…

手機廣告投放(phone advertising)唯一標識

手機標示&#xff0c;為了識別用戶&#xff0c;方面advertising。 使用設備id&#xff0c;相當于暴露用戶隱私。慢慢已不允許使用。、 &#xff08;長時間跟蹤用戶無異于暴露用戶隱私&#xff0c;雖然大量數據適合興趣建模&#xff0c;廣告個性化推薦。但復雜多樣會降低總體的準…

android分辨率比例成像,像素不是唯一 決定成像效果你必知的真相

像素并不是唯一如今不少人在選購一部手機時&#xff0c;非常重視手機攝像頭的像素大小&#xff0c;因為一部高像素的手機可以為不少喜愛拍照的人省去買單反的費用&#xff0c;而且攜帶起來也非常方便。不過&#xff0c;手機并不能與專業的單反相機相比&#xff0c;成像效果并不…

vim——打開多個文件、同時顯示多個文件、在文件之間切換

打開多個文件&#xff1a; 1.vim還沒有啟動的時候&#xff1a; 在終端里輸入 vim file1 file2 ... filen便可以打開所有想要打開的文件 2.vim已經啟動 輸入 :open file 可以再打開一個文件&#xff0c;并且此時vim里會顯示出file文件的內容。 同時顯示多個文件&#xff1a; :s…

Android底部導航欄實現(一)之BottomNavigationBar

BottomNavigationBar這個控件的使用之前已經寫過&#xff0c;這里不再贅述&#xff0c;詳情請參考BottomNavigationBar的使用。 下面直接上代碼&#xff1a; 初始化及相關設置&#xff1a; mBottomNavigationBar (BottomNavigationBar) view.findViewById(R.id.bottom_navigat…

jq 組裝數組_Jquery 數組操作

1、數組的創建var arrayObj new Array(); //創建一個數組var arrayObj new Array([size]); //創建一個數組并指定長度&#xff0c;注意不是上限&#xff0c;是長度var arrayObj new Array([element0[, element1[, ...[, elementN]]]]); 創建一個數組并賦值要說明的是&…

android 官方說明文檔,Android官方文檔翻譯-Accessibility

標簽元素向用戶提供解釋每個可互動元素的意義和目的有用且形象的標簽是非常重要的。這些標簽允許屏幕閱讀者(比如 TalkBack )正確向用戶解釋每個控制器的功能。你可以使用一下兩個方法提供元素的標簽&#xff1a;當展示在 Activity 的整個生命周期中都不會改變樣式的靜態元素時…

USACO 2.4.1 The Tamworth Two

牛和農夫按照固定的走法在10x10的地圖中走&#xff0c;每分鐘走一步&#xff0c;求經過幾分鐘相遇。永遠不能相遇輸出0. 純模擬的題。 判斷永遠不能相遇的方法是如果遇到了一個先前的狀態&#xff0c;那么肯定存在循環&#xff0c;必定不能相遇。 程序中把狀態表示為牛和農夫的…

013,spring boot下JedisCluster客戶端的配置,連接Redis集群

2019獨角獸企業重金招聘Python工程師標準>>> 1&#xff0c;pom依賴添加&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <type>jar</typ…

android控件使用大全,Android常見控件使用詳解

本文實例為大家分享了六種Android常見控件的使用方法&#xff0c;供大家參考&#xff0c;具體內容如下1、TextView 主要用于界面上顯示一段文本信息2、Button 用于和用戶交互的一個按鈕控件//為Button點擊事件注冊一個監聽器public class Click extends Activity{private Butto…

Ubuntu 12.10使用apt安裝Oracle/Sun JDK

Ubuntu 12.10使用apt安裝Oracle/Sun JDK apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java6-installerposted on 2014-09-05 13:30 fastdream 閱讀(...) 評論(...) 編輯 收藏 …

Afterthought 原來是這樣的啊。。。。

$(ProjectDir)Libs\Afterthought\Afterthought.Amender.exe "$(TargetPath)" "$(TargetDir)EntityFramework.Patterns.dll" 我實際上分析代碼好久&#xff0c;也沒整明白它是怎么運行的&#xff0c;看一下官方文檔明白了&#xff0c;原來。。。 Next, add …

查詢

增加文本1. create database test刪除文本2. drop database test3. create table info( code int primary key, name varchar(20) not null)auto_increment 自增長列foreign key(列名) references 主表名(列名) 外鍵關系4. drop table infoCRUD:增加語法1.insert into 表…

android 監聽界面變化,Android之頁面有變化用onWindowFocusChanged來監聽權限是否開啟...

1 問題我們需要在Activity里面監聽網絡變化、熱點是否開啟和關閉、GPS服務是否開啟、位置權限是否開啟等一些列行為。2 思路方法一&#xff1a;如果是需要啟動activity進行權限申請&#xff0c;我們可以用如下組合模式var intent Intent(Settings.ACTION_LOCATION_SOURCE_SETT…

逐步優化求解最大子序列和

求解最大子序列和 tag&#xff1a; 數據結構與算法 最大子序列和問題&#xff1a; 給定序列A1, A2&#xff0c;... AN&#xff0c; 求最大的子序列和。 例如 &#xff1a;   對于序列4, -3, 5, -2, -1, 2, 6, -2&#xff0c; 最大序列和為11&#xff08;4 -3 5 - 2 - 1 2 …

POJ 1228 —— “穩定”凸包

POJ 1228 Grandpas Estate 這是個好題目&#xff0c;同時也是個不和諧的題目&#xff08;不和諧原因是題目出的存在漏洞&#xff0c;數據弱&#xff0c;而且有些條件沒給清楚&#xff0c;為了一個SB錯誤無限WA之后&#xff0c;終于AC&#xff09; 題意就廢了我好長時間&#xf…

pythonflaskmock數據_Flask實現簡單Mock Server

Mock Server充當的角色&#xff1a;Mock server在實際項目中的意義就相當于數據庫。將我想要的數據返回給我就行&#xff0c;我并不關心你怎么邏輯處理的。一般的應用程序請求方式是GET和POST。Flask自帶的request使用:request.url獲取當前的請求url全路徑地址&#xff0c;requ…

在Application_Error事件中獲取當前的Action和Control

ASP.NET MVC程序處理異常時&#xff0c;方法有很多&#xff0c;網上也有列舉了6種&#xff0c;下面是使用全局處理在Global.asax文件的Application_Error事件中實現。既然是ASP.NET MVC,我需要捕捉到Controller和Action名稱。怎樣實現可以參考下面代碼&#xff1a; 程序運行結果…

android 真機 sqlite3,在android真機上使用sqlite3

#zijun#2013.10.29#QQ:223663737在android真機上使用sqlite3前期準備:1:保證手機已經ROOT操作步驟:1 : 打開CMD2 : 進入android linuxadb shell3 :切換到root權限su - root4 : 修改system目錄為可讀寫權限mount -oremount,rw -t yaffs2 /dev/block/mtdblock3 /system5 :拷貝文件…