このチュートリアルでは、既存のデータベースを対象とする Code First 開発の概要を説明します。 Code First では、C# クラスまたは VB.Net クラスを使用してモデルを定義できます。 必要に応じて、クラスとプロパティの属性を使用するか、fluent API を使用して追加の構成を実行できます。
前提条件
このチュートリアルを完了するには、 Visual Studio 2012 または Visual Studio 2013 をインストールする必要があります。
Entity Framework Tools for Visual Studio のバージョン 6.1 (またはそれ以降) もインストールされている必要があります。 Entity Framework ツールの最新バージョンのインストールについては、「Entity Framework の取得」を参照してください。
1. 既存のデータベースを作成する
通常、既存のデータベースを対象としている場合は既に作成されますが、このチュートリアルでは、アクセスするデータベースを作成する必要があります。
先に進み、データベースを生成しましょう。
Visual Studio を開く
サーバー エクスプローラーの表示 ->
[ データ接続] -> [接続の追加]を右クリックします。..
データ ソースとして Microsoft SQL Server を選択する必要がある前に、サーバー エクスプローラーからデータベースに接続していない場合
LocalDB インスタンスに接続し、データベース名として 「Blogging 」と入力します
[OK] を選択すると、新しいデータベースを作成するかどうかを確認するメッセージが表示されたら、[はい] を選択します。
新しいデータベースがサーバー エクスプローラーに表示され、それを右クリックして [新しいクエリ] を選択します
次の SQL を新しいクエリにコピーし、クエリを右クリックして [実行] を選択します。
CREATE TABLE [dbo].[Blogs] (
[BlogId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (200) NULL,
[Url] NVARCHAR (200) NULL,
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);
CREATE TABLE [dbo].[Posts] (
[PostId] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (200) NULL,
[Content] NTEXT NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')
2. アプリケーションを作成する
簡単にするために、Code First を使用してデータ アクセスを行う基本的なコンソール アプリケーションを構築します。
- Visual Studio を開く
- ファイル -> 新規 -> プロジェクト...
- 左側のメニューとコンソール アプリケーションから Windows を選択する
- 名前として 「CodeFirstExistingDatabaseSample 」と入力します
- [OK] を選択します。
リバースエンジニアリングモデル
Entity Framework Tools for Visual Studio を使用して、データベースにマップするための初期コードを生成します。 これらのツールは、必要に応じて手動で入力できるコードを生成するだけです。
Project -> 新しい項目の追加...
左側のメニューから [データ] を選択し、エンティティ データ モデル ADO.NET します
名前として「BloggingContext」と入力し、[OK] をクリックします。
これにより、エンティティ データ モデル ウィザードが起動します。
[データベース] から [Code First] を選択し、[次へ] をクリックします
最初のセクションで作成したデータベースへの接続を選択し、[次へ] をクリックします。
[テーブル] の横にあるチェックボックスをクリックしてすべてのテーブルをインポートし、[完了] をクリックします。
リバース エンジニアリング プロセスが完了すると、プロジェクトに多数の項目が追加されます。追加された内容を見てみましょう。
構成ファイル
App.config ファイルがプロジェクトに追加されました。このファイルには、既存のデータベースへの接続文字列が含まれています。
<connectionStrings>
<add
name="BloggingContext"
connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
構成ファイルには他にもいくつかの設定があります。これらは、データベースを作成する場所を Code First に指示する既定の EF 設定です。 既存のデータベースにマッピングしているため、これらの設定はアプリケーションでは無視されます。
派生コンテキスト
BloggingContext クラスがプロジェクトに追加されました。 コンテキストはデータベースとのセッションを表し、クエリを実行してデータを保存できます。 コンテキストは、モデル内の各型に対して DbSet<TEntity> を公開します。 また、既定のコンストラクターは name= 構文を使用して基本コンストラクターを呼び出していることにも注意してください。 これにより、Code First に対して、このコンテキストに使用する接続文字列を構成ファイルから読み込む必要があることを示します。
public partial class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingContext")
{
}
public virtual DbSet<Blog> Blogs { get; set; }
public virtual DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
構成ファイルで接続文字列を使用する場合は、常に name= 構文を使用する必要があります。 これにより、接続文字列が存在しない場合、Entity Framework は規則によって新しいデータベースを作成するのではなく、スローされます。
モデル クラス
最後に、 Blog クラスと Post クラスもプロジェクトに追加されました。 これらは、モデルを構成するドメイン クラスです。 Code First 規則が既存のデータベースの構造と一致しない構成を指定するために、クラスに適用されるデータ注釈が表示されます。 たとえば、データベースの最大長が 200 であるため、Blog.Name と Blog.Url に StringLength 注釈が表示されます (Code First の既定値は、データベース プロバイダーでサポートされている最大長 nvarchar(max) を SQL Server で使用することです)。
public partial class Blog
{
public Blog()
{
Posts = new HashSet<Post>();
}
public int BlogId { get; set; }
[StringLength(200)]
public string Name { get; set; }
[StringLength(200)]
public string Url { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
4. データの読み取りと書き込み
モデルが作成されたので、それを使用していくつかのデータにアクセスします。 次に示すように、Program.csで Main メソッドを実装します。 このコードは、コンテキストの新しいインスタンスを作成し、それを使用して新しいブログを挿入 します。 次に、LINQ クエリを使用して、タイトルごとにアルファベット順に並べられたデータベースからすべての ブログ を取得 します。
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine();
var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
これで、アプリケーションを実行してテストできます。
Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...
データベースが変更された場合はどうなりますか?
Code First to Database ウィザードは、クラスの開始点セットを生成するように設計されており、その後、調整や変更を行うことができます。 データベース スキーマが変更された場合は、クラスを手動で編集するか、別のリバース エンジニアリングを実行してクラスを上書きできます。
既存のデータベースへのコードファースト移行の使用
既存のデータベースで Code First Migrations を使用する場合は、既存のデータベース への Code First Migrations を参照してください。
まとめ
このチュートリアルでは、既存のデータベースを使用した Code First 開発について説明しました。 Entity Framework Tools for Visual Studio を使用して、データベースにマップされ、データの格納と取得に使用できる一連のクラスをリバース エンジニアリングしました。
.NET