Entity Framework 6で既存のデータベースを使って別のアプリを作るには
2019-11-08
azblob://2022/11/11/eyecatch/2019-11-08-entityframework-database-first-local.jpg

はじめに

この間は、Entity Framework 6を使ってデータベースをコードファーストで作成し、CRUDを試みた方法を解説しました。
この方法を使うことによって、.Net環境でアプリケーションを作成するときにアプリケーションをデータベースと繋いで基本的な操作を行うことができるようになりました。
さて、今度はその作成したデータベースを別のアプリケーションやサービスでも使うことになった場合を考えてみます。
新しいアプリケーションを作成してそれを既に存在するデータベースに接続し、スキーマをコード上で使えるようにするにはどのようにすればいいでしょうか?
それが今回のお題になります。
さっそくやり方をお見せします。

この例の前提

Entity Framework 6を使ってコードからデータベースを作ってCRUDできるまでにおいて少なくとも一度はデータベースの作成に成功していること。
その際、プロジェクト名はEntityFrameworkExampleとしていること。ただし、プロジェクト名については別の名前で作成していても一部変更するだけで手順を実行できます。

既存のデータベースから新しいアプリケーションに接続方法とスキーマを取り込む

まずはプロジェクトを作成します。
が、今回は.Net Frameworkのコンソールアプリとしてアプリケーションを作成してください。
これは、.Net Core2.2だとそのままではADO.NET Entity Data Modelを用いてデータベースの接続情報がインポートできないためです。
.Net Core環境で既存のSQL Serverのデータベースに接続してスキーマを取得する方法については、別途解説しようと思います。

まずは、SQL Server オブジェクトエクスプローラーを開きます。
メニューバーの「表示」から見つけられると思います。

すると左にエクスプローラーが開かれるので、データベースフォルダの中に前回のブログの例で作成したEntityFrameworkExample.Contextが配下においてあるデータベースの名前をコピーします。
もしも前回の例で別の名前でプロジェクトを作成していた場合はその際につけた名前になっているはずなので、それを探してください。

次に、メニューバーのプロジェクトの欄から「新しい項目の追加」を選択します。

すると作成するもののメニューが出てくるのでADO.NET Entity Data Modelを選択します。
名前は今回はデフォルトです。

次のメニューでは今回は「データベースからEF Designer」を選択します。
※ここで「データベースからCode First」を選択する方法もあります。これについては別途投稿する予定です。
選択したら、次へをクリックします。

次に接続するデータベースの情報を入力します。

画像では一度既に接続していて接続文字列が表示されたりしているのですが、実際にはまだ接続先が空欄になっているはずなので「新しい接続」を選択します。

サーバー名の欄に先ほどコピーしたデータベースのサーバー名をペーストします。すると、データベースの接続から接続できるデータベースの一覧が表示されるはずなので、今回の例ではEntityFrameworkExample.Contextを選択します。

前回他の名前でプロジェクトを作成していた場合はその名前が表示されるはずなのでそれを選択します。
OKを押して戻ります。

モデルに含める情報を選択します。
テーブルを選択して完了します。

しばらくするといくつかのファイルが生成され、このような画面が出てくると思います。
これが前回作成したデータベースの図です。

これでデータベースの接続方法とスキーマをインポートできたので、これを利用して新しいアプリケーションからデータベースの操作を行ってみようと思います。
Program.csのclass Program以下の中身を書き換えましょう。

class Program
{
    static void Main(string[] args)
    {
        using (var context = new Entities())
        {
            Console.WriteLine("データを初期化しています");
            context.Models.RemoveRange(context.Models.ToList());
            context.SaveChanges();
            Console.WriteLine("データを追加しています");
            context.Models.Add(new Models { Column1 = "test", Column2 = 123 });
            context.Models.Add(new Models { Column1 = "test2", Column2 = 456 });
            context.SaveChanges();
            var datas = context.Models.ToList();
            Console.WriteLine("DB内に保存されているデータは:");
            datas.ForEach(d => Console.WriteLine($"{d.Column1}:{d.Column2}"));
            Console.ReadLine();
        }
    }
}

うまくコードが動くと、以下のような結果が出力されます。
データベースに値が入力されているのが確認できますね。
前回作ったプロジェクトをもう一度開いて、そこでこのデータが取り出せるか試してみるのもいいかもしれません。

データを初期化しています
データを追加しています
DB内に保存されているデータは:
test:123
test2:456

おわりに

今回は、.Net Frameworkのアプリケーションから既存のデータベースに接続して操作を行えるようにする方法を解説しました。
アプリケーションを作るにあたってデータベースを作る、アプリケーションからアクセスするといった要件はほぼほぼ必須のように感じられます。
今回はシンプルな例で実践してみましたが、業務で使用するものでも役立てられれば幸いです。

参考:Database First