web-dev-qa-db-ja.com

Entity Framework Coreで複数のDbSetプロパティ名を使用してDbContextをスキャフォールディングする方法は?

Scaffold-DbContextPackage Manager Consoleコマンドを使用して、既存のSQLServerデータベースのコンテキストとエンティティを作成および再作成します。

Scaffold-DbContext -provider EntityFramework.MicrosoftSqlServer -connection "my connection string"

DbSetには、単数形のプロパティ名があります。

public partial class MyDbContext : DbContext
{
    public virtual DbSet<Request> Request { get; set; }
    public virtual DbSet<RequestHeader> RequestHeader { get; set; }
}

私はこれらの名前を複数形(Requestsなど)にすることを好みます。 Web検索に加えて、コマンド構文を確認しました。

get-Help Scaffold-DbContext -detailed

そして、この振る舞いを変えるものは何も見つかりませんでした。これが私のpackages.configです:

<packages>
  <package id="EntityFramework.Commands" version="7.0.0-rc1-final" targetFramework="net46" />
  <package id="EntityFramework.Core" version="7.0.0-rc1-final" targetFramework="net46" />
  ...
</packages>

足場を組むときにDbSet名を複数形にする方法は?

UPDATE 2017-04:DBFirstスキャフォールディングの複数化がEntityFramework Core1.1で可能になりました。詳細については、以下の私の 回答 をお読みください。

18
Ilya Chumakov

短い答え

1.パッケージをインストールします

Install-Package Bricelam.EntityFrameworkCore.Pluralizer

2. Scaffold-DbContextコマンドを実行します

Scaffold-DbContext -Connection "Server=<server>;Database=<dbname>;user id=<userid>;password=<pwd>;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data/EFModels/


長い答え:

@ natemcmasterのコメントで@ KalinKrastevが指摘しているように回答。 EF Coreでの複数化は、を使用してインストールできるBricelam.EntityFrameworkCore.Pluralizerというパッケージを使用して可能です。

パッケージマネージャーコンソール(PMC)または

dotnet add package Bricelam.EntityFrameworkCore.Pluralizer

dotnetcliを使用します。

パッケージをインストールした後、通常のScaffold-DbContextコマンドを使用するだけです。

Scaffold-DbContext -Connection "Server=<server>;Database=<dbname>;user id=<userid>;password=<pwd>;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Data/EFModels/ -Force

BricelamのPluralizerの詳細を参照

1
Hamza Khanzada

EF Core1.1では複数化が可能です。 Rowan Miller ブログで説明 のように、Inflectorをインストールし、IDesignTimeServicesを実装して、スキャフォールディング時に複数化を制御する必要があります。ただし、次の点に注意してください。

これらのサービスを* .internal名前空間に配置し、いつでもAPIを破壊する権利を留保します。

したがって、完全なコード例がここにコピーされないのはこのためです。この答えは同じ理由で受け入れられません-私は安定したAPIを取得するまで待つことを好みます。

考慮すべきもう1つの問題-このソリューションはプロバイダーに依存します。 SQL Serverで正常に動作します(私はそれをテストしました)。別のDBMSプロバイダーがこのAPIをまだサポートしていない可能性があります。たとえば、最新の Npgsql.EntityFrameworkCore.PostgreSQL 1.1.0は、カスタムIDesignTimeServicesが使用されている場合にscaffoldで失敗します。

2
Ilya Chumakov

RC1以降、EF7では複数化はサポートされていません。 EF7スキャフォールディングのこれと他の制限はここで追跡されています: https://github.com/aspnet/EntityFramework/issues/4038

1
natemcmaster