web-dev-qa-db-ja.com

Entity Framework Core RC2テーブル名の複数形

このコードがEF Core RC 2で行ったことを行う方法はありますか?

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
31
Paul Speranza

EF RC2ビルドの時点では、これに関する規約はありません。これはEF Coreチームからのものです。

過去のEF Coreのプレリリースでは、エンティティのテーブル名はエンティティクラス名と同じでした。 RC2では、DbSetプロパティの名前を使用するようになりました。指定されたエンティティタイプに対してDbSetプロパティが定義されていない場合、エンティティクラス名が使用されます。


テーブルのRC1命名規則に戻したい場合、次の3つの方法があります。


1。DbSetプロパティの特異名の選択:

1つの方法は、DbSetプロパティ名を特異化することです(これは好きではありません)。たとえば、Bookエンティティがあり、Bookテーブル:

public DbSet<Book> Book { get; set; }


2。ToTable()Fluent APIを使用:

もちろん、常に流れるようなAPIを使用して、所定の規則をオーバーライドし、テーブル名を任意に指定できます。

modelBuilder.Entity<Book>().ToTable("Book");


。カスタム規則の作成:

EF Core RC2にはこれに関する規約がないからといって、独自のコードを書くことができないわけではありません。そのためには、最初にModelBuilderオブジェクトに拡張メソッドを作成する必要があります。

using Microsoft.EntityFrameworkCore.Metadata.Internal;

public static class ModelBuilderExtensions 
{
    public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
    {
        foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
        {
            entity.Relational().TableName = entity.DisplayName();
        }
    }
}

そして、OnModelCreatingメソッドからDbContextオブジェクトで呼び出すだけです:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.RemovePluralizingTableNameConvention();
}


閉会時:

私は複数のテーブル名が好きではなく、最後のオプションが他のテーブル名よりも好きなので、それを使いました。それは私の個人的な意見であり、他の開発者はこれらの3つの方法のいずれかが他の方法よりも有利であると判断し、それを選択する可能性があります:)

82
Morteza Manavi

EF Coreバージョンはentity.DisplayNameをサポートしていないようです。これは代替案です:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    // Skip shadow types
    if (entityType.ClrType == null)
        continue;

    entityType.Relational().TableName = entityType.ClrType.Name;
}
8
Nullius

Entity Framework NETコアv2では、pluralizeを選択するか、DbSetsおよびCollectionsをフックで特異化できます。

public class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection services)
    {
        services.AddSingleton<IPluralizer, MyPluralizer>();
    }
}

public class MyPluralizer : IPluralizer
{
    public string Pluralize(string name)
    {
        return Inflector.Inflector.Pluralize(name) ?? name;
    }

    public string Singularize(string name)
    {
        return Inflector.Inflector.Singularize(name) ?? name;
    }
}

詳細については、この回答を参照してください: https://stackoverflow.com/a/47410837/8690

2
Nick N.

EF Core 3.0の場合、これを使用してTableNameプロパティを設定します(entity.Relational()がもう存在しないため):

public static class ModelBuilderExtensions 
{
    public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
    {
        foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
        {
            entity.SetTableName(entity.DisplayName());
        }
    }
}
0
Métoule

これもオプションです。

 using System.ComponentModel.DataAnnotations.Schema;

 [Table("Book")]
 public class Book
 {...}

ただし、各エンティティに注釈を付ける必要があります

0