Entity Framework Coreを使用してデータベースにアクセスする(Oracle記事)
https:// www.cnblogs.com/GuZhenYin/p/10756548.html
わあ。。ブログを書いてからほぼ1年になります。
最近、いろいろな家事や会社の新しい枠組みで忙しくて、ようやくウェーブをアップデートするのに時間がかかりました。
この記事では主に、OracleデータベースにアクセスするためのEntity Framework Coreのマイニングピットについて説明します。。
強調するために、OracleデータベースにアクセスするEntity Framework Coreに関するOracle公式DLLは、この記事が公開される前に正式にリリースされていません。
しかし、私はそれをプロジェクトで使用しました。。マインドフル兄弟は最初に待つことができます。。オラクルは今年の第3四半期について話している。。
1.公式ドキュメントでサポートされている環境
まず、いわゆる公式サポートについて見てみましょう。
オペレーティングシステム:
1. Windows x64
1.1Windows 8.1(ProおよびEnterpriseエディション)
1.2Windows 10 x64(Pro、Enterprise、およびEducation Edition)
1.3Windows Server 2012 R2 x64(Standard、Datacenter、Essentials、およびFoundationEditions)
1.4Windows Server 2016 x64(StandardおよびDatacenter Editions)
2.Linux x64
2.1Oracle Linux 7
2.2Red Hat Enterprise Linux 7
.NETバージョン:
1.NET Core 2.1以降
2.NET Framework 4.6.1以降
・Entity Framework Coreのバージョン:
1. 2.1以降のバージョン
依存ライブラリ:
1. ODP.NET Core 18.3以降
2. Microsoft.EntityFrameworkCore.Relational 2.1以降
3.Oracle Database 11gリリース2(11.2)以降へのアクセス
この記事では、CodeFirstの形式でデータベースを作成します。。
1.データベースを作成する
次のようにコンテキストとエンティティを作成します。
パブリッククラスBloggingContext:DbContext { public DbSet <Blog> Blogs {get; セットする; } public DbSet <Post> Posts {get; セットする; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseOracle(@ "SQL Contion"、b => b.UseOracleSQLCompatibility( "11")); } protected override void OnModelCreating(ModelBuilder modelBuilder) { } } public class Blog { public int BlogId {get; セットする; } public string Url {get; セットする; } // public int Rating {get; セットする; } public List <Post>投稿{get; セットする; } } public class Post { public int PostId {get; セットする; } public string Title {get; セットする; } public string Content {get; セットする; } public int BlogId {get; セットする; } パブリックブログブログ{get; セットする; } }
ここでは、最初に最初に注意する点を紹介します。11で渡されるパラメータであるUseOracleパラメータのUseOracleSQLCompatibilityメソッドは、oracle11gバージョンを指します。12gバージョンの場合は12を渡してください。
11gと12gのSQL構文にはより多くの違いがあるため、これを使用して区別します。
次に、次のようにnugetコマンドを実行するバージョンを追加します(PS:codeFirstの使用方法がわからない場合は、移動してください:Entity Framework Coreデータベースの移行)。
Add-Migration BanBen1
次に、次のようにデータベースのバージョンを更新します。
データベースを更新する
データベースは正常に生成されました。
2. oracleシーケンスについてピット
ここで、次のようにinsertステートメントを記述します。
using(BloggingContext db = new BloggingContext()) { db.Blogs.Add(new Blog {Url = "aaaaa1"}); db.SaveChanges(); }
問題のないステートメントのようですが、次のようなエラーメッセージが表示されます。
インデックスが範囲外でした。負ではなく、コレクションのサイズ未満である必要があります。
パラメータ名:インデックス
これは、主キーの割り当てによって発生したエラーメッセージが表示されなかったためです。(Oracleは主キーを増分しないため、シーケンスごとにしか増分できません)
では、自動インクリメントシーケンスの使用方法を教えてください。
図に示すように、データベースが見つかります。
codefirstによってシーケンスが生成されましたが、自動的には使用されません。設定する必要があります:
次のコードをコンテキストのOnModelCreatingメソッドに追加します。
保護されたオーバーライドvoid OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity <Post>(entity => { entity.ToTable( "Posts"); entity.Property(o => o.PostId).ForOracleUseSequenceHiLo( "Posts_PostId_sq3"); }) ; modelBuilder.Entity <Blog>(entity => { entity.ToTable( "Blogs"); entity.Property(o => o.BlogId).ForOracleUseSequenceHiLo( "Blogs_BlogId_sq1"); }); }
対応表の順序を指定します。
次に実行します。正常に追加できます。
3. Dockerにデプロイされたピットについて
私の制作プロジェクトでは。直接実行してデプロイするには、Dockerにパッケージ化する必要があります。
しかし、Dockerへのパッケージ化の過程で、奇妙な問題が再び現れました。
複製されません。。とにかく、開発環境に問題はありません。。Linuxに直接置いても問題ありません。ただし、Docker操作にパッケージ化されると、データはクエリされません。
多くの検証の結果、バージョンシステムが削減されたため、Microsoftから提供されたラムタイムミラーが問題であることが最終的に判明しました。
次のステートメントをdockerfileに追加して、生成時にタイムゾーンを設定します。
FROM microsoft / dotnet:2.1-aspnetcore-runtime ENV TZ = Asia / Shanghai
これにより、データベースを正常に操作できます。。
最近、いくつかのプロジェクトを.NET COREに移植し、多かれ少なかれピットに遭遇しました。。無数の穴として数える必要があります。。
実際、それらのほとんどはデータベース接続に集中しています。。たとえば、Oracle DB2。。(追記:mysqlおよびsqlサーバーのサポートが最高だと思います...)
DB2は正式にリリースされていますが。しかし、彼の穴は実際にはオラクルよりも大きいです。。次に書いています。。
わあ。。ブログを書いてからほぼ1年になります。
最近、いろいろな家事や会社の新しい枠組みで忙しくて、ようやくウェーブをアップデートするのに時間がかかりました。
この記事では主に、OracleデータベースにアクセスするためのEntity Framework Coreのマイニングピットについて説明します。。
強調するために、OracleデータベースにアクセスするEntity Framework Coreに関するOracle公式DLLは、この記事が公開される前に正式にリリースされていません。
しかし、私はそれをプロジェクトで使用しました。。マインドフル兄弟は最初に待つことができます。。オラクルは今年の第3四半期について話している。。
1.公式ドキュメントでサポートされている環境
まず、いわゆる公式サポートについて見てみましょう。
オペレーティングシステム:
1. Windows x64
1.1Windows 8.1(ProおよびEnterpriseエディション)
1.2Windows 10 x64(Pro、Enterprise、およびEducation Edition)
1.3Windows Server 2012 R2 x64(Standard、Datacenter、Essentials、およびFoundationEditions)
1.4Windows Server 2016 x64(StandardおよびDatacenter Editions)
2.Linux x64
2.1Oracle Linux 7
2.2Red Hat Enterprise Linux 7
.NETバージョン:
1.NET Core 2.1以降
2.NET Framework 4.6.1以降
・Entity Framework Coreのバージョン:
1. 2.1以降のバージョン
依存ライブラリ:
1. ODP.NET Core 18.3以降
2. Microsoft.EntityFrameworkCore.Relational 2.1以降
3.Oracle Database 11gリリース2(11.2)以降へのアクセス
この記事では、CodeFirstの形式でデータベースを作成します。。
1.データベースを作成する
次のようにコンテキストとエンティティを作成します。
パブリッククラスBloggingContext:DbContext { public DbSet <Blog> Blogs {get; セットする; } public DbSet <Post> Posts {get; セットする; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseOracle(@ "SQL Contion"、b => b.UseOracleSQLCompatibility( "11")); } protected override void OnModelCreating(ModelBuilder modelBuilder) { } } public class Blog { public int BlogId {get; セットする; } public string Url {get; セットする; } // public int Rating {get; セットする; } public List <Post>投稿{get; セットする; } } public class Post { public int PostId {get; セットする; } public string Title {get; セットする; } public string Content {get; セットする; } public int BlogId {get; セットする; } パブリックブログブログ{get; セットする; } }
ここでは、最初に最初に注意する点を紹介します。11で渡されるパラメータであるUseOracleパラメータのUseOracleSQLCompatibilityメソッドは、oracle11gバージョンを指します。12gバージョンの場合は12を渡してください。
11gと12gのSQL構文にはより多くの違いがあるため、これを使用して区別します。
次に、次のようにnugetコマンドを実行するバージョンを追加します(PS:codeFirstの使用方法がわからない場合は、移動してください:Entity Framework Coreデータベースの移行)。
Add-Migration BanBen1
次に、次のようにデータベースのバージョンを更新します。
データベースを更新する
データベースは正常に生成されました。
2. oracleシーケンスについてピット
ここで、次のようにinsertステートメントを記述します。
using(BloggingContext db = new BloggingContext()) { db.Blogs.Add(new Blog {Url = "aaaaa1"}); db.SaveChanges(); }
問題のないステートメントのようですが、次のようなエラーメッセージが表示されます。
インデックスが範囲外でした。負ではなく、コレクションのサイズ未満である必要があります。
パラメータ名:インデックス
これは、主キーの割り当てによって発生したエラーメッセージが表示されなかったためです。(Oracleは主キーを増分しないため、シーケンスごとにしか増分できません)
では、自動インクリメントシーケンスの使用方法を教えてください。
図に示すように、データベースが見つかります。
codefirstによってシーケンスが生成されましたが、自動的には使用されません。設定する必要があります:
次のコードをコンテキストのOnModelCreatingメソッドに追加します。
保護されたオーバーライドvoid OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity <Post>(entity => { entity.ToTable( "Posts"); entity.Property(o => o.PostId).ForOracleUseSequenceHiLo( "Posts_PostId_sq3"); }) ; modelBuilder.Entity <Blog>(entity => { entity.ToTable( "Blogs"); entity.Property(o => o.BlogId).ForOracleUseSequenceHiLo( "Blogs_BlogId_sq1"); }); }
対応表の順序を指定します。
次に実行します。正常に追加できます。
3. Dockerにデプロイされたピットについて
私の制作プロジェクトでは。直接実行してデプロイするには、Dockerにパッケージ化する必要があります。
しかし、Dockerへのパッケージ化の過程で、奇妙な問題が再び現れました。
複製されません。。とにかく、開発環境に問題はありません。。Linuxに直接置いても問題ありません。ただし、Docker操作にパッケージ化されると、データはクエリされません。
多くの検証の結果、バージョンシステムが削減されたため、Microsoftから提供されたラムタイムミラーが問題であることが最終的に判明しました。
次のステートメントをdockerfileに追加して、生成時にタイムゾーンを設定します。
FROM microsoft / dotnet:2.1-aspnetcore-runtime ENV TZ = Asia / Shanghai
これにより、データベースを正常に操作できます。。
最近、いくつかのプロジェクトを.NET COREに移植し、多かれ少なかれピットに遭遇しました。。無数の穴として数える必要があります。。
実際、それらのほとんどはデータベース接続に集中しています。。たとえば、Oracle DB2。。(追記:mysqlおよびsqlサーバーのサポートが最高だと思います...)
DB2は正式にリリースされていますが。しかし、彼の穴は実際にはオラクルよりも大きいです。。次に書いています。。