.NET ヘルプ

NHibernate C#(開発者向けの動作方法)

ジョルディ・バルディア
ジョルディ・バルディア
2024年6月6日
共有:

NHibernate C#(開発者向けの動作方法): 図1 - NHibernate C#のホームページ

NHibernateオブジェクトリレーショナルマッピング(Object Relational Mapping)の強力な(ORM (オブジェクト関係マッピング)).NETフレームワークで使用するために設計されたフレームワーク。 それは開発者に、.NETアプリケーションのオブジェクト指向の世界とデータベースのリレーショナルな世界を効率的に結び付ける方法を提供します。 NHibernateを使用することで、データアクセス層を実装するために必要なボイラープレートコードの量を大幅に削減でき、.NETアプリケーションがよりクリーンで保守しやすくなります。

データベース操作を簡素化するORMの役割

NHibernate のような ORM フレームワークは、SQL 文ではなくオブジェクトとそのプロパティの観点からデータを操作することで、開発者がリレーショナルデータベースとの相互作用を簡素化できるようにします。 この抽象化により、開発者は基礎となるSQLコマンドやデータベーススキーマにあまり注意を払わずに、アプリケーションのビジネスロジックにもっと集中できるようになります。 たとえば、NHibernateはすべてのSQL生成と実行を処理し、挿入、削除、および更新の操作をシンプルなオブジェクト変換とオブジェクト操作で行えるようにします。

.NETプロジェクトにおけるNHibernateの設定

.NETプロジェクトでNHibernateを始めるには、最初のステップとしてNHibernateパッケージをインストールします。 これを簡単に行うには、Visual Studio の NuGet パッケージ マネージャーを使用して、次のコマンドを実行します:

Install-Package IronPdf

NHibernate C#(開発者向けの使い方):図2 - コマンドラインコンソールを開き、上記のコマンドを入力してNHibernateをインストールします。

XML設定ファイルでNHibernateを構成する

NHibernateがインストールされたら、次のステップはそれを構成することです。 これは、データベースサーバーの設定およびオブジェクトとデータベーステーブルとのマッピングの詳細を記載したHibernateマッピングファイルを作成することを含みます。 主なXMLファイルは通常 hibernate.cfg.xmlと命名され、データベース接続文字列、方言、およびその他のデータベース固有の設定などが含まれます。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">
      Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
    </property>
    <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
    <property name="show_sql">true</property>
    <mapping resource="Employee.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
XML

NHibernateのコアコンポーネントの理解

NHibernateの重要なコンポーネントの1つは、ファクトリデザインパターンを使用して設計されたセッションファクトリです。 このコンポーネントは、データベースへの接続を管理し、トランザクション操作を保持するセッションオブジェクトを作成します。 セッションファクトリは作成するのに高コストであるため、通常はアプリケーションのライフタイムごとに一度だけ作成されます。したがって、パフォーマンスの最適化において重要な要素となります。

NHibernateの主要なクラスとメソッド

NHibernateは、いくつかの基本的なクラスとメソッドを中心に展開されます。 例えば、ISessionインターフェイスはNHibernateにおいて基本的な役割を果たし、データのクエリや操作セッションの作成を容易にします。 以下のようなメソッドは、開発者がトランザクションを開始し、SQLコマンドを実行し、SQLステートメントまたはNHibernateの独自のHQLを使用してデータベースをクエリするのに役立ちます: OpenSession(Hibernateクエリ言語).

NHibernateを使用したエンティティのデータベーステーブルへのマッピング

NHibernateにおけるエンティティマッピングは、通常XMLで記述されたマッピングファイルを通じて行われます。 これらのファイルは、しばしばエンティティクラスの名前にちなんで名付けられます。(例:Employee.hbm.xml)、エンティティのプロパティがデータベーステーブルの列にどのようにマッピングされるかを定義します。 一般的なマッピングファイルには、クラス名、テーブル名、および各プロパティの詳細(プライマリキー、カラム名、データ型を含む)が含まれます。

マッピングファイルで使用されるプロパティと属性の詳細説明

これらのマッピングファイルでは、各プロパティに対して、not-null制約や一意制約など、さまざまな属性を指定することができます。 NHibernateは、一対多および多対一のリレーションシップのような複雑なマッピングも可能にし、オブジェクト指向フレームワーク内でリレーショナルデータ構造を表現するための強力なツールセットを提供します。

NHibernateでのSQLコマンドとトランザクションの実行

NHibernateはCRUD操作を簡素化します(作成、読み取り、更新、削除)SQL コマンドの基盤を抽象化することによる操作。 開発者は、ISessionインターフェースが提供するメソッドを使用して、明示的なSQLコードを書かずにこれらの操作を実行できます。 例えば、新しいエンティティをデータベースに追加するには、オブジェクトの新しいインスタンスを作成し、そのプロパティを設定し、ISessionSaveメソッドを使用します。

ITransaction を使用したトランザクションの管理

NHibernateにおけるトランザクションはデータの整合性と一貫性を確保するためにITransactionインターフェースを介して管理されます。 ISessionのBeginTransactionメソッドを使用することで、開発者はすべての操作がデータベースにコミットされる前に正常に完了することを保証し、何か問題が発生した場合はロールバックすることができ、データの安定性を維持することができます。

完全なコード例

この例には、NHibernate の設定およびマッピングファイルのセットアップが含まれており、NHibernate を使用して Create、Read、Update、および Delete 操作を実行する方法を示しています。

using NHibernate;
using NHibernate.Cfg;
using System;
public class Employee
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}
class Program
{
    private static ISessionFactory sessionFactory;
    static void Main()
    {
        sessionFactory = new Configuration().Configure().BuildSessionFactory();
        CreateEmployee();
        ReadEmployee(1);
        UpdateEmployee(1, "UpdatedName");
        DeleteEmployee(1);
    }
    static void CreateEmployee()
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var newEmployee = new Employee
            {
                FirstName = "Iron",
                LastName = "Software"
            };
            session.Save(newEmployee);
            transaction.Commit();
            Console.WriteLine("Employee created: " + newEmployee.Id);
        }
    }
    static void ReadEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        {
            var employee = session.Get<Employee>(id);
            Console.WriteLine("Read Employee: " + employee.FirstName + " " + employee.LastName);
        }
    }
    static void UpdateEmployee(int id, string newFirstName)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var employee = session.Get<Employee>(id);
            employee.FirstName = newFirstName;
            session.Update(employee);
            transaction.Commit();
            Console.WriteLine("Employee updated: " + employee.FirstName);
        }
    }
    static void DeleteEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var employee = session.Get<Employee>(id);
            session.Delete(employee);
            transaction.Commit();
            Console.WriteLine("Employee deleted");
        }
    }
}
using NHibernate;
using NHibernate.Cfg;
using System;
public class Employee
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}
class Program
{
    private static ISessionFactory sessionFactory;
    static void Main()
    {
        sessionFactory = new Configuration().Configure().BuildSessionFactory();
        CreateEmployee();
        ReadEmployee(1);
        UpdateEmployee(1, "UpdatedName");
        DeleteEmployee(1);
    }
    static void CreateEmployee()
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var newEmployee = new Employee
            {
                FirstName = "Iron",
                LastName = "Software"
            };
            session.Save(newEmployee);
            transaction.Commit();
            Console.WriteLine("Employee created: " + newEmployee.Id);
        }
    }
    static void ReadEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        {
            var employee = session.Get<Employee>(id);
            Console.WriteLine("Read Employee: " + employee.FirstName + " " + employee.LastName);
        }
    }
    static void UpdateEmployee(int id, string newFirstName)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var employee = session.Get<Employee>(id);
            employee.FirstName = newFirstName;
            session.Update(employee);
            transaction.Commit();
            Console.WriteLine("Employee updated: " + employee.FirstName);
        }
    }
    static void DeleteEmployee(int id)
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var employee = session.Get<Employee>(id);
            session.Delete(employee);
            transaction.Commit();
            Console.WriteLine("Employee deleted");
        }
    }
}

データベースのポータビリティと相互運用性の機能

NHibernateは、データベースのポータビリティを実現するように設計されています。 その方言構成のおかげで、NHibernateはコードベースにほとんど変更を加えることなく、ほとんどのSQLデータベースに適応することができます。 これは、データアクセス層を再構築することなく、SQL ServerからMySQLやOracleに切り替えることができることを意味します。

SQL ServerのようなさまざまなデータベースシステムにNHibernateを適応させる

NHibernateのXML設定ファイルでは、開発者がデータベースシステムに特有のSQL方言を指定することができます。 これにより、NHibernateは、SQLをサポートするほぼすべてのリレーショナルデータベースで簡単に適応できる柔軟なソリューションとなり、アプリケーションを異なるデータベースシステム間で移植可能にします。

IronPDFを使用したNHibernate

NHibernate C#(開発者向けの動作方法):図3 - IronPDFのホームページ

NHibernateとの統合IronPDF.NET アプリケーションを強化できる強力な組み合わせです。 NHibernateを使用してデータベース操作を管理しながらIronPDFを活用することができます。PDFドキュメントを生成するデータから。 アプリケーションが、PDF形式で生成およびダウンロードする必要がある従業員レポートなどのユーザー固有のドキュメントを提供する必要があるシナリオを考えてみてください。 NHibernate Cはデータベースからのデータ検索プロセスを効率的に管理でき、IronPDFはこれらのデータを適切にフォーマットされたPDFファイルに変換することができます。

IronPDF をインストール

まず、プロジェクトにIronPDFを追加してください。 NuGet パッケージマネージャーを使用して IronPDF パッケージをインストールすることで、それを含めることができます。

Install-Package IronPdf
Install-Package IronPdf

NHibernate C#(開発者向けの動作原理):図4 - NuGet パッケージ マネージャーを使用して IronPDF をインストール

コード例

アプリケーションにこれを実装する方法を詳しく見ていきましょう。 NHibernateをセットアップし、従業員の詳細などの必要なデータをデータベースから取得した後、PDFドキュメントがどのように表示されるべきかを示すHTMLテンプレートを準備します。 このHTMLテンプレートは、NHibernateから取得したデータで動的に埋めることができます。 例えば、社員向けのレポートを生成する場合、テンプレートには社員の名前、ID、その他の関連する詳細情報のためのプレースホルダーが含まれます。

以下は、NHibernateを使用してデータを取得し、それをIronPDFを使用してPDFに変換するコード例です。

using IronPdf;
using NHibernate;
static void CreateEmployeeReport(int employeeId)
{
    // Open a session to interact with the database
    using (var session = OpenSession())
    {
        // Retrieve the employee object based on the provided ID
        var employee = session.Get<Employee>(employeeId);
        // Create an instance of the HtmlToPdf class from IronPDF
        var renderer = new ChromePdfRenderer();
        // Create the HTML content for the PDF, embedding employee data into the HTML
        var htmlTemplate = $@"
            <html>
            <head>
                <title>Employee Report</title>
            </head>
            <body>
                <h1>Employee Details</h1>
                <p>Name: {employee.FirstName} {employee.LastName}</p>
                <p>ID: {employee.ID}</p>
            </body>
            </html>";
        // Render the HTML string as a PDF document
        var pdf = renderer.RenderHtmlAsPdf(htmlTemplate);
        // Save the generated PDF to a file
        pdf.SaveAs("EmployeeReport.pdf");
    }
}
using IronPdf;
using NHibernate;
static void CreateEmployeeReport(int employeeId)
{
    // Open a session to interact with the database
    using (var session = OpenSession())
    {
        // Retrieve the employee object based on the provided ID
        var employee = session.Get<Employee>(employeeId);
        // Create an instance of the HtmlToPdf class from IronPDF
        var renderer = new ChromePdfRenderer();
        // Create the HTML content for the PDF, embedding employee data into the HTML
        var htmlTemplate = $@"
            <html>
            <head>
                <title>Employee Report</title>
            </head>
            <body>
                <h1>Employee Details</h1>
                <p>Name: {employee.FirstName} {employee.LastName}</p>
                <p>ID: {employee.ID}</p>
            </body>
            </html>";
        // Render the HTML string as a PDF document
        var pdf = renderer.RenderHtmlAsPdf(htmlTemplate);
        // Save the generated PDF to a file
        pdf.SaveAs("EmployeeReport.pdf");
    }
}

NHibernate C#(開発者向けの動作方法):図5 - 上記コードからの例出力

このコードでは、OpenSession() は、従業員データの取得に使用されるNHibernateセッションを初期化するメソッドです。 IronPDFのChromePdfRendererクラスは、取得したデータで埋められたHTMLテンプレートを取り込み、それをPDFとしてレンダリングします。 このPDFはローカルに保存されていますが、ウェブインターフェースを通じてユーザーに直接ストリーミングすることもできます。

結論

NHibernate C#(開発者向けの仕組み):図6 - IronPDFライセンスページ

このチュートリアルでは、NHibernateが.NETアプリケーションにおけるデータベース操作をどのように簡素化するか、そしてIronPDFとの統合により、動的なPDFドキュメントの生成を可能にし、機能性を向上させる方法を検討しました。 NHibernateは強力なデータ管理ツールを提供し、IronPDFはHTMLテンプレートからデータで埋められたプロフェッショナル品質のPDFを作成する便利な方法を提供します。

IronPDFは次のために利用可能です無料試用、およびライセンスは$749から開始し、強力なPDF生成をアプリケーションに統合するためのコスト効率の高いソリューションを提供します。 これらのツールを組み合わせることで、データの管理およびドキュメントの作成に関する包括的なソリューションが提供され、企業レベルから小規模プロジェクトに至るまで理想的です。

ジョルディ・バルディア
ソフトウェアエンジニア
ジョルディは、Iron Softwareでのスキルを活かしていないときには、ゲームプログラミングをしており、Python、C#、C++に最も堪能です。彼は製品テスト、製品開発、研究の責任を共有しており、継続的な製品改善に大きな価値をもたらしています。この多様な経験は彼を常に挑戦的で魅力的に保ち、彼はIron Softwareで働く一番好きな側面の一つだと言っています。ジョルディはフロリダ州マイアミで育ち、フロリダ大学でコンピューターサイエンスと統計学を学びました。
< 以前
Ocelot .NET (開発者にとっての動作方法)
次へ >
Rebus .NET Coreの例(開発者向けの仕組み)