How to scaffold DbContext with plural DbSet property names in Entity Framework Core?

c# entity-framework entity-framework-core sql-server visual-studio-2015

Question

I use Scaffold-DbContext command in Package Manager Console to create and re-create context and entities for an existed SQL Server database:

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

It works perfectly except one thing: DbSet's have property names in singular form:

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

I prefer these names to be in plural form (Requests etc.). In addition to web search I checked command syntax:

get-Help Scaffold-DbContext -detailed

And found nothing to change this behaviour. Here is my 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>

How to pluralize DbSet names when scaffolding?

UPDATE 2017-04: DB First scaffolding pluralization is now possible in Entity Framework Core 1.1. Read my answer below for details.

1
18
5/23/2017 12:02:11 PM

Accepted Answer

Short Answer

1. Install Package

Install-Package Bricelam.EntityFrameworkCore.Pluralizer

2. Run Scaffold-DbContext Command

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


Long Answer:

As pointed out by @KalinKrastev in the comments of @natemcmaster's answer. Pluralization in EF Core is possible using a package called Bricelam.EntityFrameworkCore.Pluralizer that can be installed using

in the Package Manager Console (PMC) or

dotnet add package Bricelam.EntityFrameworkCore.Pluralizer

using Dotnet cli.

After installing the package just use the regular Scaffold-DbContext command.

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

See More About Bricelam's Pluralizer

1
2/14/2020 1:55:30 PM

Popular Answer

Pluralization is possible in EF Core 1.1. As Rowan Miller described in its blog, you need to install the Inflector and implement IDesignTimeServices to control pluralization when scaffolding. However, be aware of it:

We put these services into *.internal namespaces and reserve the right to break the APIs at any point.

So this is why a full code example is not copied to here. This answer is not accepted for the same reason - I prefer to wait until we get a stable API.

Another issue you should consider - this solution is provider-dependent. It works fine with SQL Server (I tested it). Another DBMS provider may not support this API yet. For example, latest Npgsql.EntityFrameworkCore.PostgreSQL 1.1.0 fails on scaffold when custom IDesignTimeServices is used.



Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow