Looking for entity-framework-core Answers? Try Ask4KnowledgeBase
Looking for entity-framework-core Keywords? Try Ask4Keywords

Entity Framework CoreEntity Frameworkコアの使い方


備考

Entity Framework(EF)コアは、一般的なEntity Frameworkデータアクセステクノロジの軽量で拡張可能なバージョンです。

EFコアは、.NET開発者が.NETオブジェクトを使用してデータベースを操作できるオブジェクトリレーショナルマッパー(O / RM)です。これにより、開発者が通常書く必要のあるデータアクセスコードのほとんどが不要になります。

プロジェクトにパッケージを追加する

EntityFrameworkCoreをプロジェクトに追加するには、 project.json ファイルを更新します( dependenciestools セクションに新しい行を追加します)。

"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.SqliteNpgsql.EntityFrameworkCore.PostgreSQL など)にNpgsql.EntityFrameworkCore.PostgreSQL ください。推奨パッケージについては、RDBMSのマニュアルを参照してください。

クラスライブラリとSQL Serverを使用したEntity Frameworkコアのデータベース

さて、.NET Framework Webアプリケーションを使用して、 Class Project (.NET Core) でデータベースの作業を開始するための手順を投稿しています。

ステップ1 - .NETコアをインストールする

.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問題を実行するインストールを妨げるもの

ここに画像の説明を入力

ステップ2 - プロジェクトを作成する

新しいASP.NETコアWebアプリケーションを作成 - >次の画面でWebアプリケーションを選択

ここに画像の説明を入力

Class Library (.NET Core) プロジェクトを追加する

ここに画像の説明を入力

ステップ3 - EFパッケージのインストール

クラスライブラリの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 下のパッケージを復元するはずです

ここに画像の説明を入力

---------------- OR

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-*"
        }
      }
    }
  }
 

ステップ4 - データベースモデルの作成

データベースを生成するには、 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();
}