[再投稿] Entity Framework Coreを使用してデータベースにアクセスする(Oracleの記事)Entity Framework Coreを使用してデータベースにアクセスする(Oracleの記事)Entity Framework Coreデータベースの移行

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は正式にリリースされていますが。しかし、彼の穴は実際にはオラクルよりも大きいです。次に書いています。

著者:区インド出典:のhttp:あなたはあなたが助けにこの記事を読んでいると思われる場合//www.cnblogs.com/GuZhenYin/は、「お勧め」ボタンをクリックしてくださいは、あなたが「推奨」私の最大の記録パワーになります!この記事の著作権は著者とブログガーデンに属します。転載を歓迎しますが、著者の同意なしにこの段落のステートメントを保持し、記事のページで
 
序文

わあ。ブログを書いてからほぼ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は正式にリリースされていますが。しかし、彼の穴は実際にはオラクルよりも大きいです。次に書いています。

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/12698532.html