Entity Framework(EF)コアは、一般的なEntity Frameworkデータアクセステクノロジの軽量で拡張可能なバージョンです。
EFコアは、.NET開発者が.NETオブジェクトを使用してデータベースを操作できるオブジェクトリレーショナルマッパー(O / RM)です。これにより、開発者が通常書く必要のあるデータアクセスコードのほとんどが不要になります。
EntityFrameworkCoreをプロジェクトに追加するには、 project.json
ファイルを更新します( dependencies
とtools
セクションに新しい行を追加します)。
"dependencies": { ... "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0", "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0", "Microsoft.EntityFrameworkCore.Design": { "version": "1.0.0", "type": "build" }, }, "tools": { ... "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" }
実際にこれらのパッケージをインターネットからダウンロードdotnet restore
には、 dotnet restore
を実行することを忘れないでください。
Microsoft SQLServer以外のRDBMSを使用している場合は、 Microsoft.EntityFrameworkCore.SqlServer
を正しいバージョン( Microsoft.EntityFrameworkCore.Sqlite
、 Npgsql.EntityFrameworkCore.PostgreSQL
など)にNpgsql.EntityFrameworkCore.PostgreSQL
ください。推奨パッケージについては、RDBMSのマニュアルを参照してください。
さて、.NET Framework Webアプリケーションを使用して、 Class Project (.NET Core)
でデータベースの作業を開始するための手順を投稿しています。
.NETコアではないDNXを使用して(Hint: You should be able to see the .NET Core option when creating a New Project)
- ここからダウンロードしない場合
.NET Coreをインストールする際に問題がある場合(Visual Studio 2015 Update 3が正しくインストールされていないなどのエラー) - [ DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1
]コマンドを使用してインストールを実行できます。 Visual StudioチェックのGithub問題を実行するインストールを妨げるもの
新しいASP.NETコアWebアプリケーションを作成 - >次の画面でWebアプリケーションを選択
Class Library (.NET Core)
プロジェクトを追加する
クラスライブラリのproject.json
ファイルを開き、次のファイルを保存して、ファイルを保存します。
{
"version": "1.0.0-*",
"dependencies": {
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
"NETStandard.Library": "1.6.0"
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"net46": {
},
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-*"
}
}
}
}
}
これはReferences
下のパッケージを復元するはずです
Nuget Package Managerを使用してインストールするには、パッケージマネージャコンソールで次のコマンドを実行します
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
注:一度に1つのパッケージをインストールしてください - インストール後にエラーが発生した場合
Microsoft.EntityFrameworkCore.Tools
次に、 project.json
フレームワークセクションの内容をこれに変更します。
"frameworks": {
"net46": {
},
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-*"
}
}
}
}
データベースを生成するには、 Package Manager Console
で次のコマンドを実行します(接続文字列をデータベースに変更することを忘れないでください)
Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer
これにより、スタートアッププロジェクトに関するエラーが表示されます。
このためには、クラスライブラリに追加したのと同じ参照を.NET Web Appに追加する必要があります
そのため、Webアプリケーション用のproject.json
を開き、
dependencies
下で、以下を追加してください:
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
tools
下に追加:
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
変更後ファイルを保存します。
これは私のproject.jsonのようなものです
次に、パッケージマネージャコンソールでクラスライブラリに対してコマンドを再度実行します。
クラスライブラリの参照をWebアプリケーションにまだ追加していない場合は、次のエラーが発生します。
この問題を解決するには、クラスライブラリの参照をWebアプリケーションに追加します。
コマンドを再度実行する - Package Manager Console
次の操作を実行します。
Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
これはモデルフォルダの下のエンティティをクラスライブラリに作成する必要があります
私のケースでは、マルチテナントアプリケーションがあります。マルチテナントアプリケーションは、各クライアントが独自のデータベース(Client_1、Client_2、Client_3など)を持っています。したがって、接続文字列は動的でなければなりませんでした。
コンストラクタに接続文字列プロパティを追加し、それをOnConfiguring
メソッドのコンテキストにOnConfiguring
public partial class ClientContext
{
private readonly string _connectionString;
public ClientContext(string connectionString) : base()
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}
次のように使用します。
public void TestConnection()
{
var clientId = 1;
var connectionString = string.Format("Server=192.168.0.211; Database=Client_{0}; user id= USER; password = PWD;", clientId);
using (var clientContext = new ClientContext(connectionString))
{
var assets = clientContext.Users.Where(s => s.UserId == 1);
}
}
EFコアでは、データアクセスはモデルを使用して実行されます。モデルはエンティティクラスとデータベースとのセッションを表す派生コンテキストで構成され、データのクエリと保存を可能にします。
既存のデータベースからモデルを生成したり、データベースと一致するモデルを手作業でコーディングしたり、EFマイグレーションを使用してモデルからデータベースを作成したり(モデルの経時変化に応じて進化させることができます)。
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
namespace Intro
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { 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; }
}
}
エンティティクラスのインスタンスは、言語統合クエリ(LINQ)を使用してデータベースから取得されます。
using (var db = new BloggingContext())
{
var blogs = db.Blogs
.Where(b => b.Rating > 3)
.OrderBy(b => b.Url)
.ToList();
}
データは、エンティティクラスのインスタンスを使用して、データベース内で作成、削除、および変更されます。
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
db.Blogs.Add(blog);
db.SaveChanges();
}
エンティティクラスのインスタンスは、言語統合クエリ(LINQ)を使用してデータベースから取得されます。
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
db.Blogs.Attach(blog);
db.Blogs.Remove(blog);
db.SaveChanges();
}
データは、エンティティクラスのインスタンスを使用してデータベース内で更新されます。
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
var entity = db.Blogs.Find(blog);
entity.Url = "http://sample2.com";
db.SaveChanges();
}