久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

在Oracle中使用Entity Framework 6 CodeFirst

 _明心見性_ 2018-02-27

標簽:

項目中需要將系統(tǒng)從SQLServer數(shù)據(jù)庫遷移到Oracle上,。由于原大部分數(shù)據(jù)訪問操作都是通過包裝了Entity Framework的統(tǒng)一訪問入口實現(xiàn)的,所以需要研究Entity Framework從SQLServer轉移到Oracle的實現(xiàn)方式,。

自從EF4.X起,,Oracle就為EF提供了驅動支持,但是很可惜的是不支持CodeFirst模式,。慶幸的是從ODP.NET 11.2.0.3.0開始,,Oracle官方提供了支持CodeFirst的純托管代碼的EF驅動。但是有以下幾點是需要知道的;

  1. ODP.NET for .NET Framework 4.0支持Entity Framework和LINQ to Entities,,但ODP.NET for .NET Framework 2.0并不支持,。
  2. Code First的特性只能在Entity Framework 6 以上的版本才能使用。
  3. ODP.NET和Entity Framework支持標量參數(shù)綁定,。Entity Framework支持通過名稱的參數(shù)綁定,,不支持通過位置的參數(shù)綁定。
  4. 只支持訪問Oracle 10g release2及以后版本
  5. 使用可升級和分布式事務需要Oracle Service for Microsoft Transaction Server 12.1,。ODP.NET在分布式事務中只支持讀級別的隔離,。

如何使用CodeFirst

接下來才是我們真正需要關心的,如何在項目中使用CodeFirst(本篇默認你已經(jīng)了解CodeFirst的概念和使用方法),。

有兩種方式能找到我們需要的dll:通過Oracle官網(wǎng)下載(在\odp.net4\odp.net\managed\common中),,通過NuGet安裝。這里我推薦使用NuGet安裝,。在程序包管理控制臺輸入:

install-package Oracle.ManagedDataAccess.EntityFramework

 

修改app.config配置如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework"
      type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      requirePermission="false"/>
  </configSections>
  <connectionStrings>
    <add name="SampleDataSource" providerName="Oracle.ManagedDataAccess.Client"
    connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=**SERVICE_NAME**)));Persist Security Info=True;User ID=**User ID**;Password=**Password**"/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory 
      type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client"
        type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client"/>
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver"
      type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no"/>
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/>
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

 

定義一個實體對象:
    public class SomeInfo
    {
        public Guid Id { get; set; }
        public DateTime DateTimeField { get; set; }
        public bool BooleanField { get; set; }
        public decimal DecimalField { get; set; }
        public int IntField { get; set; }
        public string StringField { get; set; }
    }
定義數(shù)據(jù)上下文:
    public class TestDbContext : DbContext
    {
        public TestDbContext()
            : base("name=SampleDataSource")
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TestDbContext>());
        }

        public DbSet<SomeInfo> SomeInfos { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //這里需要指定schema,,默認是sqlserver的dbo
            modelBuilder.HasDefaultSchema("YOURSCHEMA");
            base.OnModelCreating(modelBuilder);
        }
    }

在確保連接字符串是正確的情況下就可以寫一段測試代碼來驗證了。驗證的代碼這里就不介紹了,。

.NET類型到Oracle類型的映射

由于Oracle和SQLServer的數(shù)據(jù)類型有些不同所以這里需要介紹下.NET的數(shù)據(jù)類型和Oracle數(shù)據(jù)類型的映射,。

.NET數(shù)據(jù)類型Oracle數(shù)據(jù)類型映射方法
Boolean number(1, 0) 使用EDM映射,注意:需要使用EDM映射配置,,參考附加信息文檔EDM映射節(jié) ,。
Byte number(3, 0) 使用EDM映射,注意:需要使用EDM映射配置,,參考附加信息文檔EDM映射節(jié) ,。
Byte[] blob 默認
Int16 number(5, 0) 默認,注意:需要使用EDM映射配置,,參考附加信息文檔EDM映射節(jié) ,。
Int32 number(10, 0) 默認,,注意:需要使用EDM映射配置,參考附加信息文檔EDM映射節(jié) ,。
Int64 number(19, 0) 默認,,注意:需要使用EDM映射配置,參考附加信息文檔EDM映射節(jié) ,。
Decimal number(18, 2) 默認
Single binary_float 默認
Double binary_double 默認
Guid raw(16) 默認
DateTime date 默認
DateTimeOffset timestamp withtime zone 默認
String nclob 默認
String clob 使用IsUnicode() fluent API設置Unicode為false
String nvarchar2 使用HasMaxLength() fluent API或MaxLength標記設置MaxLength不大于2000
String varchar2 使用HasMaxLength() fluent API或MaxLength標記設置MaxLength不大于4000,,使用IsUnicode() fluent API設置Unicode為false
String nchar 使用HasMaxLength() fluent API或MaxLength標記設置MaxLength不大于1000,使用HasColumnType() fluent API或Column標記設置Column Type為NCHAR
String char 使用HasMaxLength() fluent API或MaxLength標記設置MaxLength不大于2000,,使用HasColumnType() fluent API或Column標記設置Column Type為NCHAR
String Long 使用HasColumnType() fluent API或Column標記設置Column Type為LONG,,注意: 不推薦使用Long數(shù)據(jù)類型。
String rowid 使用HasColumnType() fluent API或Column標記設置Column Type為ROWID
String urowid 使用HasColumnType() fluent API或Column標記設置Column Type為UROWID

注意:

基于字符的列,,即:CHAR,,NCHAR,VARCHAR2,,NVARCHAR2可以存儲指定(MaxLength)的字符,。但是受限于Oracle的設計,這些列只能存儲最多4000 byte,。存儲的數(shù)據(jù)和數(shù)據(jù)庫字符集的設定會使有些字符可能需要多個byte,,所以盡管這些類型的列被配置為4000(MaxLength)但是可能存儲不了這么多字符。如果待存儲的數(shù)據(jù)超過4000byte可以使用CLOB或NCLOB類型的列,。

Oracle數(shù)據(jù)類型的特性配置

接下來的表格里將列出Oracle所支持的Data Annotation和Fluent API:

Data AnnotationFluent API目的應用于
Key HasKey 設置主鍵. All Scalar Types
Required IsRequired 設置列為NOT NULL. All
MaxLength HasMaxLength 設置列最大長度 String
NotMapped Ignore 無需映射該屬性 All
ConcurrencyCheck IsConcurrencyToken 該列需要被用作為樂觀并發(fā)檢查

 

注意:不要使用無長度上限的string屬性,,因為這會被映射為LOB類型。使用LOB類型的列最為并發(fā)檢查會導致ORA-00932: inconsistent datatypes error.錯誤,。

All
TimeStamp IsRowVersion 并發(fā)控制字段 Not Supported
Column HasColumnType 指定對應數(shù)據(jù)庫數(shù)據(jù)列類型,。

 

注意:必須是合法的兼容類型。例如一個Date屬性是不能映射到number列的,。

All
N/A IsUnicode 表示映射到一個N-type類型(nvarchar2或nclob),,默認為true。 String
N/A HasPrecision 表示設置decimal的精度,。 Decimal

Code First數(shù)據(jù)遷移

數(shù)據(jù)遷移的方式和使用SQLServer是一致的,,但是需要注意以下兩點:

  1. 唯一能自定義的是更改表的user schema
  2. Code First自動遷移只能使用dbo schema。所以需要顯示的使用Add-Migration命令進行基于代碼的數(shù)據(jù)遷移,。

Code First數(shù)據(jù)庫初始化

ODP.NET支持一下幾種數(shù)據(jù)庫初始化方式:

  • CreateDatabaseIfNotExists (默認)
  • DropCreateDatabaseAlways
  • DropCreateDatabaseIfModelChanges
  • NullDatabaseInitializer
  • MigrateDatabaseToLatestVersion

由于Oracle和SQL Server對數(shù)據(jù)庫(database)的定義不同,,數(shù)據(jù)庫初始化動作作用于模型中所有Oracle對象。Oracle數(shù)據(jù)庫沒有新建或刪除,,而構成該模型的對象被認為是對數(shù)據(jù)庫的一種操作,。

Oracle數(shù)據(jù)庫對象創(chuàng)建

為了支持客戶端應用程序,ODP.NET創(chuàng)建和維護所需的數(shù)據(jù)庫對象。下面列舉了provider提供的可創(chuàng)建和維護的數(shù)據(jù)庫對象:

  • Table
  • Table Column
  • Primary Key
  • Foreign Key
  • Index
  • Sequence
  • Trigger

注意:

Sequence和Trigger在Oracle 11g R2之后的版本中創(chuàng)建,,早期版本的數(shù)據(jù)庫支持標識列,。

直接和客戶端相關的對象,即:一個表對應一個類,,一個列對應一個屬性,,這些對象的命名都是由客戶端提供的,對象的命名必須滿足Oracle數(shù)據(jù)庫中對對象標識長度的限制,。如果類名的長度超長了,,那么在創(chuàng)建這個對象時就會報ORA-00972: identifier is too long的異常。

對于剩余的對象,,如果提供的命名長度大于數(shù)據(jù)庫標識長度顯示,那么ODP.NET回利用命名生成算法,。如果提供的命名未超長那就直接使用,。在所有情況下,對象名稱會被創(chuàng)建為帶引號的標識符一方面是為了保持大小寫,,另一方面任何特殊字符都可以作為標識符的一部分,。

命名算法會按照下面兩種方式工作:

  • 從頭開始截取原始名稱中的一段
  • 從原名稱計算出一個數(shù)字后綴

下面例子演示一個類對象名稱是如何被截取的:

public class LongSamplePocoTestClassName
{
  [Key]
  public int Id { get; set; }
 
  [MaxLength(64)]
  public string Name { get; set; }
}

默認生成的主鍵名稱為:

 
PK_LongSamplePocoTestClassNames

這個名稱包含31(最多支持30個字符)個字符,超出了限制,。將對其做截取操作,,最后生成:

 
PK_LongSamplePocoTes_730795129

算法被設計為盡可能的保留更多的原始名稱。

原創(chuàng)文章,,轉載請注明: 轉載自xdlysk的博客

本文鏈接地址: 在Oracle中使用Entity Framework 6 CodeFirst

在Oracle中使用Entity Framework 6 CodeFirst

標簽:

原文地址:http://www.cnblogs.com/xdlysk/p/5169140.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多