Entity Framework With Oracle

來源:互聯網
上載者:User

雖然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" )   ENABLE   VALIDATE;-- Creating primary key on "LodgingId"in table 'Lodgings'ALTER TABLE "GYOUNG"."Lodgings"ADD CONSTRAINT "PK_Lodgings"   PRIMARY KEY ("LodgingId" )   ENABLE   VALIDATE;-- ---------------------------------------------------- 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")   ENABLE   VALIDATE;-- 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中,不然很多資料類型映射會出錯。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.