千呼萬喚始出來! Oracle官方版Entity Framework問市,邁入開發新時代

自從我得了一種"不用LINQ就不會寫資料庫程式"的病,為了滿足工作上要搭配Oracle(雖然我也是百般不願意)的需求,在官方遲遲不支援Entity Framework的情況下,只好求助於3rd Party產品

去年(2011)三月,Oracle總算良心發現,推出了ODAC Entity Framework Beta版,但這一杯塔就杯了近一年,遲遲等不到正式版問市。Beta版意味著"玩玩還可以,出包沒人理",無法真的推到實務專案中,還是沒解決問題。

終於,Oracle釋出ODAC 11.2 Release 4 Production Released with Entity Framework and LINQ Support!! 二話不說,立刻下載安裝。

安裝過程跟Oracle Client類似,在此不多著墨,值得一提的是發現了新東西,Oracle Database Extensions for .NET,其概念很像SQLCLR,意味著可用.NET寫Store Procedure、User Defined Function,並可在PL/SQL中直接引用呼叫。想到一堆用PL/SQL笨拙語法寫成的複雜Procedure可以用C#改寫,乍想之下令人頗為興奮,但很快就回歸現實: 第一,Database Extensions for .NET只適用於Oracle Database for Microsoft Windows,若規劃時大量採用,而實務環境資料庫卻都安裝在Unix平台就糗大了;第二,依架構來看,.NET寫的Procedure與Function被放在另一個獨立Process中執行,若涉及大量資料運算時,難免會有跨Process的資料傳輸,有效能上的疑慮。(這部分跟SQLCLR的特性限制類似) 因此在應用上有其限制,必須嚴選情境使用。

本想順便看看Database Extensions for .NET,但踢到了小鐵板! 由於在Oracle Server主機也要安裝ODAC(上圖紅框選項,Oracle Server主機選下方,其餘主機要選擇上方的for Oracle Client選項),安裝在手邊的Oracle Database Express Edition 11g Release 2(簡稱Oracle XE)時,爆出了版本必須為11.2.0.3的訊息,目前Oracle尚未提供11.2.0.3版XE,且即便是Oracle企業版,也得透過客服支援才能取得Patch升級到11.2.0.3版。再看了文件,可行的做法應是在Oracle XE上安裝11.1.0.6.20以後的ODAC,不必裝到11.2.0.3... 不過你知道的,我對Oracle的愛並沒有旺盛到想克服一切難關嚐鮮,所以... 以後再試囉~~ (關於Database Extensions for .NET,Oracle有篇不錯的逐步教學,值得一看)

回到主題,該來看看在Oracle Entity Framework推出後,Oracle資料庫相關程式的開發方式將有什麼改變?

傳統上.NET開發者在寫Oracle應用程式時,習慣會用Toad、PL/SQL Developer等工具查看資料表、Procedure等資訊,並在其中執行語法測試確認結果後,在Visual Studio中透過ODP.NET或System.Data.OracleClient建立OracleConnection、執行OracleCommand完成資料庫存取作業。

11.2.0.3版除了支援EF,還內附Oracle Developer Tools for Visual Studio(ODT),它也將改變傳統開發方式,透過與Visual Studio緊密結合,讓你可以直接在Visual Studio內完成許多資料庫相關工作,例如: 修改Schema、分析程式效能、測試及偵錯PL/SQL指令、管理User/Role/Privilege、將.NET類別轉成User-Defined Type、由Excel/SQL匯入資料表到Oracle... 等等。MSDN上有段簡介影片,看過之後,我想蟾蜍(Toad)的臉會綠掉,牠的飯碗被搶了! 原本需要第三方工具才能完成的事,現在可在Visual Studio直接搞定,用得還是熟悉的Visual Studio UI,帥呀~~

Oracle有篇詳盡的Entity Framework逐步教學,但對於未接觸過EF、LINQ的人稍稍複雜了點,故我用個更簡單的範例來展示"開發.NET Oracle應用程式的新時代做法"。在展示中,我們要在Oracle上新增一個資料表(Player),並寫一小段程式在其中新增一筆資料,再把它查詢出來。

1.請先安裝好ODAC 11.0.2.3 with Oracle Developer Tools for Visual Studio

2.建立一個.NET 4.0 Console Application專案

3.開啟Server Explorer

4.建立新連線,Data source選"Oracle Database (Oracle ODP.NET)",輸入識別名稱、帳號、密碼

5.連線建立後,可檢視Table/View/Procedure/Function (蟾蜍: 鳴~ 這原來是我的工作耶!), 
   新增PLAYER Table,新增欄位、選取資料型別...

6.也可指定Primary Key、Constraint、Index,按下Preview SQL可檢視CREATE TABLE Script,按下Save即建立資料表

7.在專案中新增ADO.NET Entity Data Model

8.選擇由現有資料表產生Model

9.選擇剛才建立的連線(JEFF.XE),並指定將連線字串存入Config中(在實務上連線字串應使用加密方式保存,正式上線的系統務必要留意這一點)

10.選取我們要為哪一個Table、View、Procedure建立Model類別,在這裡只有一個Table PLAYER 
    (Pluralize or singularize generated object names將決定PLAYER集合物件是否要寫成PLAYERs)

11.在建立好的Model(.edmx)中可以看到PLAYER Table

12.接下來是愉快的動手寫程式時間

程式很簡單,建立一個EF的Context(JeffEntities),宣告一個全新的PLAYER物件,指定各屬性(資料庫的每一個欄位都被映對到.NET類別中的一個屬性,奶油桂花手們再也不用擔心敲錯名稱抓蟲抓半天囉),將物件加入集合(ctx.PLAYER.AddObject),再ctx.SubmitChages()就會新增至資料庫!

至於查詢,此處則用Single(o => o.ID == 1)查詢剛才塞入的資料,ODP.NET會幫忙將其轉換成SELECT * FROM PLAYER WHERE ID = 1送到Oracle執行,查詢結果則會被轉成PLAYER類別,接著將它的NAME顯示出來證明查詢成功。

排版顯示純文字
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace OracleEF
{
    class Program
    {
        static void Main(string[] args)
        {
            using (JeffEntities ctx = new JeffEntities())
            {
                //新增一筆資料
                PLAYER p = new PLAYER()
                {
                    ID = 1,
                    NAME = "Jeffrey",
                    REGDATE = new DateTime(2012, 4, 1),
                    SCORE = 32767
                };
                ctx.PLAYER.AddObject(p);
                ctx.SaveChanges();
                //查詢資料
                var res = ctx.PLAYER.Single(o => o.ID == 1);
                Console.WriteLine(res.NAME);
            }
            Console.Read();
        }
    }
}

執行結果如下,順便用PL/SQL Developer驗證資料真的在資料庫中。

還在用Toad、OracleConnection、OracleCommand寫.NET程式嗎? 從現在起,試試Oracle Developer Tools + Entity Framework的新選擇吧!

Oracle官方版Entity Framework的更多相关文章

  1. 在Oracle中使用Entity Framework 6 CodeFirst

    项目中需要将系统从SQLServer数据库迁移到Oracle上.由于原大部分数据访问操作都是通过包装了Entity Framework的统一访问入口实现的,所以需要研究Entity Framework ...

  2. Oracle中使用Entity Framework 6.x Code-First

    Oracle中使用Entity Framework 6.x Code-First方式开发 去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下O ...

  3. Oracle中使用Entity Framework 6.x Code-First方式开发

    去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版): 1.Using ...

  4. 如何使用ASP.NET Web API OData在Oracle中使用Entity Framework 6.x Code-First方式开发 OData V4 Service

    环境: Visual Studio 2013 + .Net Framework 4.5.2 1.新建项目 2.安装OData,ODP.NET 安装的包: 下面是部分代码: using System; ...

  5. Entity Framework 6, database-first with Oracle

    Entity Framework 6, database-first with Oracle 转载自http://csharp.today/entity-framework-6-database-fi ...

  6. Entity Framework入门教程:什么是Entity Framework

    Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. ...

  7. Entity Framework 6 自定义连接字符串ConnectionString连接MySQL

    在开始介绍之前,首先来看看官方对Entity Framework的解释:Entity Framework (EF) is an object-relational mapper that enable ...

  8. 使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  9. Oracle 与 entity framework 6 的配置,文档

    官方文档: http://docs.oracle.com/cd/E56485_01/win.121/e55744/intro001.htm#ODPNT123 Oracle 对 微软 实体框架 EF6 ...

随机推荐

  1. [Spring入门学习笔记][Spring Boot]

    什么是Spring Boot Spring Boot正是在这样的一个背景下被抽象出来的开发框架,它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架 ...

  2. [HeadFirst-HTMLCSS学习笔记][第八章扩大你的词汇量]

    字体 font-family,可指定多个候选 body{ font-family:Verdana,Geneva,Arial,sans-serif; } font-size 字体大小 body{ fon ...

  3. NET基础课--泛型(NET之美)

    1.泛型,类型或方法的一种抽象概括. 2.泛型类:在类型名后面加一个<>,其中传递占位符,也就是类型参数.where是类型约束 可以再查资料 public class SortHelper ...

  4. gdal_merge.py

    1 gdal_merge.py: 合并(Merge)/镶嵌(Mosaic)工具.要求图像必须是相同坐标系统.具有相同的波段数:可以不同分辨率,可以有重叠区域(后加入图像覆盖先加入的图像). 注意:只能 ...

  5. java final 和instanceof 关键字

    /* final class A { public final void eat(){ System.out.println("测试"); } } */ class A { } c ...

  6. C++程序设计实践指导1.1删除序列中相同的数改写要求实现

    改写要求1:改写为以指针为数据结构 #include <iostream> #include <cstdlib> using namespace std; class ARP ...

  7. Js之History对象

    Window对象的history属性引用的是该窗口的History对象.History对象是用来把窗口的浏览历史用文档和文档状态列表的形式表示.History对象的length属牲表示浏览历史列表中的 ...

  8. apche commons项目简介

    1.apche commons项目封装了日常开发中经常使用的功能,如io, String等. http://commons.apache.org/ Apache Commons项目的由三部分组成: T ...

  9. 使用URLConnection获取网页信息的基本流程

    参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...

  10. 子元素用margin-top 为什么反而作用在父元素上?对使用margin-top 的元素本身不起作用?

    在这个说明中,“collapsing margins”(折叠margin)的意思是:2个或以上盒模型之间(关系可以是相邻或嵌套)相邻的margin属性(这之间不能有非空内容.padding区域.bor ...