アレアレ

お役立ち情報、お悩み解決情報を発信!

visual studio code

Macの.NET CoreアプリからSQL Serverにアクセスする方法

Macの.NET CoreアプリからSQL Serverにアクセスする方法

今回は、Macで.NET Coreアプリ開発に興味がある人にお伝えしたいお役立ち情報です。

この記事を書いている現在、Mac、Linux、Windowsのクロスプラットフォームで動作する.NET Core環境が整い、Visual Studio Codeを利用したプログラミングの開発環境も、安定して来ている状況です。

で、.Net Coreには、Entity Frameworkという、ORMを利用して、データベースにアクセスすることができ、その利用方法については、次の2ドキュメントが参考になります。

  1. .NET Core Application to New SQLite Database
  2. ASP.NET Core Application to Existing Database (Database First)

この2ドキュメントですが、https://docs.efproject.net/というサイトで、マイクロソフトが公開している、.Net CoreのEntity Frameworkの使い方を学ぶためのチュートリアルとなっています。

ただ、この2ドキュメントを読んでも、Macで作った.NET Coreアプリから、SQL Serverにアクセスするための方法がわからないんですね。

というのも、1つ目のドキュメントは、SQLiteを使うことになっていますし、2つ目のドキュメントは、SQL Serverを使うサンプルなのですが、こちらはWindowsのVisual Studioを使う前提となっているからです。

つまり、Macで作った.Net Coreアプリから、SQL Serverに接続するチュートリアルが、今現在ないんですね。

そこで、この2ドキュメントを合わせた感じで、そのサンプルをご紹介したいというのが、この記事の趣旨です。

開発環境

では、まず、開発環境からご紹介します。

  • OS: macOS Sierra バージョン 10.12
  • .Net Core: 1.0.0-preview3-003612
  • SQL Serverの環境: VM ware fusion上のWindows 10にSQL Server 2016 Expressをインストール

SQL Server Expressを外部からアクセスできるようにする設定は、次の記事が参考になります。

・SQL Server Express にリモート接続
https://creativeweb.jp/fc/remote/

この記事では、Macからネットワーク的に接続できるSQL Server Expressがすでにある前提とします。

project.json

では、本題に入ります。まず、今回の方法ですが、基本的流れは、上でご紹介した「.NET Core Application to New SQLite Database」の記事の通りです。

そして、この記事では、SQLiteを使っているところを、「SQL Serverを使う場合はこうなる」という感じでご紹介します。つまり、.Net Coreアプリの開発方法などの詳しい解説は省きます。

簡単には、yoコマンドでaspnetのテンプレート選び、「SqlServerSample」というプロジェクト名でコンソールアプリを生成するのがスタートです。

次に、SQL Serverにアクセスするためのライブラリを参照する形で、project.jsonを編集します。具体的には、次のようになります。

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0"
    },
    "Microsoft.EntityFrameworkCore": "1.0.0",
    "Microsoft.EntityFrameworkCore.Design": {
      "version": "1.0.0-preview2-final",
      "type": "build" 
    },
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  },

  "tooling": {
    "defaultNamespace": "SqlServerSample"
  },

  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" 
  }
}

特に「Microsoft.EntityFrameworkCore.SqlServer」を使っているのがポイントですね。

Program.cs

以上で、project.jsonの編集が完了したら、後は、メインの処理となるProgram.csを記述するだけです。

具体的には、次のように編集します。

using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace SqlServerSample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using (var db = new BloggingContext())
            {
                db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
                var count = db.SaveChanges();
                Console.WriteLine("{0} records saved to database", count);

                Console.WriteLine();
                Console.WriteLine("All blogs in database:");
                foreach (var blog in db.Blogs)
                {
                    Console.WriteLine(" - {0}", blog.Url);
                }
            }
        }
    }

    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var connection = @"Server=[DBサーバーのIP],1433;Database=[データベース名];UID=[ユーザー名];PWD=[パスワード];MultipleActiveResultSets=true;";
            optionsBuilder.UseSqlServer(connection);
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
        public string Name { get; set; }

        public List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}

ちなみに、このプログラムを実行する前に、SQL Server側にサンプル用のデータベースを作っておくことを忘れないようにしてください。

そうした前提で、ターミナルから次のコマンドを試すと、SQL Serverの該当のデータベースに、BlogsとPostsのテーブルができているはずです。

dotnet ef migrations add MyFirstMigration
dotnet ef database update

それが確認できたら、次のコマンドを実行します。

dotnet run

正常に動作すると、SQL ServerのBlogsテーブルからデータを取得し、それが標準出力に出力されます。

Return Top