標簽: 項目中需要將系統(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驅動。但是有以下幾點是需要知道的;
如何使用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; } } 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ù)類型的映射,。
Oracle數(shù)據(jù)類型的特性配置接下來的表格里將列出Oracle所支持的Data Annotation和Fluent API:
Code First數(shù)據(jù)遷移數(shù)據(jù)遷移的方式和使用SQLServer是一致的,,但是需要注意以下兩點:
Code First數(shù)據(jù)庫初始化ODP.NET支持一下幾種數(shù)據(jù)庫初始化方式:
由于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ù)庫對象:
直接和客戶端相關的對象,即:一個表對應一個類,,一個列對應一個屬性,,這些對象的命名都是由客戶端提供的,對象的命名必須滿足Oracle數(shù)據(jù)庫中對對象標識長度的限制,。如果類名的長度超長了,,那么在創(chuàng)建這個對象時就會報ORA-00972: identifier is too long的異常。 對于剩余的對象,,如果提供的命名長度大于數(shù)據(jù)庫標識長度顯示,那么ODP.NET回利用命名生成算法,。如果提供的命名未超長那就直接使用,。在所有情況下,對象名稱會被創(chuàng)建為帶引號的標識符一方面是為了保持大小寫,,另一方面任何特殊字符都可以作為標識符的一部分,。 命名算法會按照下面兩種方式工作:
下面例子演示一個類對象名稱是如何被截取的: 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 標簽: 原文地址:http://www.cnblogs.com/xdlysk/p/5169140.html |
|
來自: _明心見性_ > 《Entity Framework》